当前位置: 首页 > 知识库问答 >
问题:

Swagger codegen反序列化动态响应

太叔经赋
2023-03-14

从我的Java后端,我正在使用另一个我不管理的后端,它的API定义不可用。我正在创建它的服务的OpenAPI定义,并使用Swagger Codigen来生成客户端。

有一个endpoint返回一个复杂对象:

{
    "total": 151,
    "version": 4,
    "dynamicItem1": [
        "codeDynamicItem1",
        293,
        63700,
        19,
        "nameDynamicItem1",
        "",
        "",
        "",
        0,
        -64
    ],
    "dynamicItem2": [
        "codeDynamicItem2",
        237,
        40000,
        478,
        "nameDynamicItem2",
        "string1",
        "string2",
        "string3",
        0,
        0
    ]

}

在该对象中,totalversion始终存在,但在同一级别上有数百个动态项。在上面的示例中,关键点是可以预测的,但实际上是字母和数字的序列,类似于“245df921”。动态项始终是具有相同项数和相同预期位置的数组。

为了解析该对象,我使用了附加属性,因为我读到它是解析hashmap的正确方法,但似乎我没有正确应用它。

当前,我的OpenAPI表示形式如下所示:

openapi: 3.0.2
info:
  version: 1.0.0
  title: title
  description: description
paths:
  /complexObject:
    get:
      responses:
        '200':
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Object'
components:
  schemas:
    Object:
      type: object
      properties:
        total:
          type: number
          example: 151
        version:
          type: number
          example: 4
        additionalProperties:
          type: array
          items:
            type: string
            nullable: true

使用该实现可以正确返回totalversion,但是在响应对象中有一个additionalProperties属性,该属性的值为null。

我错过了什么?

共有1个答案

宁修永
2023-03-14

附加属性需要与属性处于同一级别。

此外,由于这些动态数组是多类型(字符串/整数),您需要oneOf来定义可能的项类型。

components:
  schemas:
    Object:
      type: object
      properties:
        total:
          type: number
          example: 151
        version:
          type: number
          example: 4
      additionalProperties:   # <-----
        type: array
        items:
          oneOf:              # <-----
            - type: string
              nullable: true
            - type: integer
 类似资料:
  • 问题内容: 我有以下需要反序列化的Json字符串。 第一个字段“ 123456789”是一个ID号,因此基本上该值可以根据要查询的数据而有所不同。 我在Visual Studio中使用C#。显然,因为第一个字段的值可以更改,所以我无法使用预定义的类将JSON反序列化为该字段,因为该字段将用作类名,但该字段的值与该类名不匹配。 有没有一种方法可以将其反序列化为某种动态类,但仍可以像访问预定义类一样访

  • 我对Jackson和类型层次结构有以下问题。我正在序列化一个类SubA,该类将扩展为一个字符串,然后尝试将其反序列化回来。当然,在编译时,系统不知道它是基还是SubA,因此我希望它是基,如果它是SubA,则会在编译后执行一些其他操作。 我的基本类看起来像: ...和一个派生自的类: ... 我试图执行以下代码: String是: 但我一次又一次地犯同样的错误。映射器现在知道如何处理另一个类参数-它

  • 问题内容: 场景: 考虑以下是JSON: 如果注意到的话,数据的结构方式是没有硬编码键提及/ 它基本上只是值。 问题: 我无法解析任何动态的JSON。 问题: 有人能找到这种JSON解析的解决方案吗?我尝试了go-simplejson,gabs和default 但没有运气。 注意: 上面的JSON仅用于示例。而且有许多应用程序正在使用当前的API,因此我不想更改数据的结构。我的意思是我不能更改为以

  • 场景: 考虑以下是JSON: 如果您注意到,数据的结构是这样的,即没有硬编码键提到/基本上只是值。 问题:我无法解析任何动态 JSON。 问题:有人能找到这种JSON解析的解决方案吗?我试着简单点 注意:以上JSON只是示例。有很多应用程序正在使用当前的API,所以我不想改变数据的结构。我的意思是我不能换成如下的东西: 然后我可以定义< code>struct

  • I'va是一个OID接口,可以由许多具体类型实现: 现在我有一个具有两个字段的对象,一个使用抽象接口类型(OID)定义,另一个使用具体类型(MyOID)定义 我想使用jackson以不同的方式序列化/反序列化字段,无论它们是使用抽象接口类型还是具体类型定义的: 注意,被序列化,包括类型信息(多态序列化),而被序列化为文本 为此,我将OID接口注释为: 并为每个具体类型分配了类型id: 最后,对容器