相关疑难解决方法(0)

Jackson JsonTypeInfo.As.EXTERNAL_PROPERTY无法正常工作

我正在使用Jackson来解析我无法控制的JSON.JSON看起来像这样:

{
    "status":"0"
    "type":"type1"
    "info": {
       // additional fields
    }
}
Run Code Online (Sandbox Code Playgroud)

我的班级看起来像这样

public class Response {
    private String status;
    private String type;
    private Info info
}
Run Code Online (Sandbox Code Playgroud)

我使用的Info的子类取决于type属性,所以我对info的映射是

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes(value = {
        @JsonSubTypes.Type(value = Type1Info.class, name = "type1"),
        @JsonSubTypes.Type(value = Type2Info.class, name = "type2") })
public abstract class Info {
    // some fields
}
Run Code Online (Sandbox Code Playgroud)

据我所知,当区别元素与必须被转换的元素处于同一级别时,这是使用类型信息的正确方法.但这不起作用,我总是得到同样的错误:

com.fasterxml.jackson.databind.JsonMappingException:意外的标记(END_OBJECT),期望的FIELD_NAME:缺少属性'type',包含类型id

如果我将EXTERNAL_PROPERTY更改为PROPERTY,我仍会得到相同的错误.我对EXTERNAL_PROPERTY的理解是错误的吗?

polymorphism json jackson

24
推荐指数
1
解决办法
1万
查看次数

根据父属性反序列化 json 子类型

我有一个带有动态attribute子项的 json,如下所示:

{  
  "label":"Some label",
  "attribute": {     <--- Dynamic attribute object
    "type": "TEXT",  <--- Field used to map `attribute` dynamic (inside child object)
    "languages":[
      {
          "language":"en_EN",
          "text":"do you approve?"
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

或者

{  
  "label":"Some label",
  "attribute": {
    "type": "NUMBER",
    "value: "10.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以使用@JsonSubTypes以下代码正确反序列化上面的 json:

{  
  "label":"Some label",
  "attribute": {     <--- Dynamic attribute object
    "type": "TEXT",  <--- Field used to map `attribute` dynamic (inside child object)
    "languages":[
      {
          "language":"en_EN",
          "text":"do you approve?"
      }
    ] …
Run Code Online (Sandbox Code Playgroud)

java json jackson spring-boot

4
推荐指数
1
解决办法
3788
查看次数

标签 统计

jackson ×2

json ×2

java ×1

polymorphism ×1

spring-boot ×1