繁体   English   中英

如何为 Jackson 编写自定义 JSON 解串器?

[英]How to write custom JSON Deserializer for Jackson?

我需要将一些 JSON 反序列化为 Java class。 我有以下 JSON:

{
  "list": [[{
        "type": "text",
        "subType": "ss"
     },
     {
        "type": "image",
        "subType": "text"
     }
]]
}

我有以下 Java 类:

public abstract class BaseClass {
    public String type;
    public String subType;
}

public class Text extends BaseClass {
   ...
}

public class Image extends BaseClass {
}

我需要以这种方式反序列化,如果type等于image且子类型等于text ,我需要反序列化为Text subType ,否则我需要反序列化为Image class。

我该怎么做?

您不需要自定义反序列化器。 使用以下注释标记您的 BaseClass,并使用 ObjectMapper 进行反序列化:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", visible = true)
@JsonSubTypes({@JsonSubTypes.Type(value = Text.class, name = "text"), @JsonSubTypes.Type(value = Image.class, name = "image")
})
public abstract class BaseClass {
    public String type;
    public String subType;
}

JsonTypeInfo定义使用type字段的值作为类型名称。 JsonSubTypes类型名称与 java 类相关联

您可以像这样实现自己的反序列化器:

public class BaseClassDeserializer extends StdDeserializer<BaseClass> { 

    public BaseClassDeserializer(Class<?> vc) { 
        super(vc); 
    }

    @Override
    public BaseClass deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        String type = node.get("type").asText();
        String subType = node.get("subType").asText();

        if("image".equals(type) && "text".equals(subType)){
            /* create Text class
            return new Text */
        } else {
            /* create Image class
            return new Image(args...) */
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM