json - Jackson JsonTypeInfo.As.EXTERNAL_PROPERTY 无法按预期工作

标签 json polymorphism jackson

我正在使用 Jackson 来解析我无法控制的 JSON。 JSON 如下所示:

{
    "status":"0"
    "type":"type1"
    "info": {
       // additional fields
    }
}

我的类(class)是这样的

public class Response {
    private String status;
    private String type;
    private Info info
}

我使用的 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
}

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

com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'type' that is to contain type id

如果我将 EXTERNAL_PROPERTY 更改为 PROPERTY,我仍然会收到相同的错误。我对 EXTERNAL_PROPERTY 的理解有误吗?

最佳答案

来自 Javadoc:

Inclusion mechanism similar to PROPERTY, except that property is included one-level higher in hierarchy, i.e. as sibling property at same level as JSON Object to type. Note that this choice can only be used for properties, not for types (classes). Trying to use it for classes will result in inclusion strategy of basic PROPERTY instead.

注意到 只能用于属性 是粗体的。来源:JsonTypeInfo.As.EXTERNAL_PROPERTY .

因此,您必须将所有注释从 Info 类移动到属性 infoResponse 中的 setInfo 方法类。

@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 void setInfo(Info info) {
    this.info = info;
}

对我来说,您还应该从 Response 类中删除 type 属性。它将在序列化过程中动态生成。在反序列化中你不需要它,因为 Jackson 关心类型。您的类(class)可能如下所示:

class Response {

    private String status;
    private Info info;

    //getters, setters
}

另请参阅此问题:JSON nest class data binding .

关于json - Jackson JsonTypeInfo.As.EXTERNAL_PROPERTY 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18757431/

相关文章:

java - 嵌入式Java对象的Jackson反序列化

php - 如何使用 httpClient 和 JSON 从 php 接收数组到 android?

java - 如何防止 Jackson 输出 pretty-print JSON?

c++ - 我怎样才能最好地在 C++ 中的不完整类型上使用多态性

java - 如何使用 Jackson 对象映射器将 Java 对象中的并非所有属性转换为 json

java - 将 Jackson Mixins 与 MappingJacksonHttpMessageConverter 和 Spring MVC 结合使用

mysql - Nodejs连接数据库或REST服务

java - 从 JSON 文件中检测和解析转义字符 "\"?

Swift:结果的失败类型不能是协议(protocol) - "Type ' 任何 ShadowError' 无法符合错误”

c++ 如何在运行时通过错误代码给用户一个合适的异常?