为什么杰克逊两次写入相同的JSON键/值?

时间:2017-03-30 13:21:44

标签: java json jackson

我与杰克逊有以下设置:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
@JsonSubTypes({
    @Type(value = Sub1.class, name = "sub1"),
    @Type(value = Sub2.class, name = "sub2")
})
abstract class BaseClass {
    private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

然后,例如,Sub1看起来像这样:

public class Sub1 extends BaseClass {
    String other;

    public String getOther() {
        return other;
    }

    public void setOther(String o) {
        other = o;
    }
}

设置基本上是允许解析包含不同类型嵌入元素的json文档。 解析有效,但是当我想写出一个Sub1实例时,奇怪的是'type'键被写入生成的JSON两次:

ObjectMapper mapper = new ObjectMapper();
Sub1 d = new Sub1();
d.setType("sub1");

mapper.writerFor(Sub1.class).writeValue(System.out, d);

我得到的输出是: { “类型”: “SUB1”, “类型”: “SUB1”, “其他”:空}

经过一些实验后,似乎其中一个'类型'条目是由

引起的
@Type(value = Sub1.class, name = "sub1")

而另一个来自'type'属性。显然我只需要在JSON中输入'type'条目。有谁知道如何防止这种情况,或者我做错了什么?

1 个答案:

答案 0 :(得分:0)

我有一个类似的问题。似乎有效的修复程序正在使用

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.EXISTING_PROPERTY,
    property = "type")

而是使用include中的JsonTypeInfo.As.EXISTING_PROPERTY。这使Jackson可以使用AsExistingPropertyTypeSerializer,如果按照Jackson的代码中的TypeSerializer#typeId(Object value, JsonToken valueShape)进行跟踪,则会看到使序列化程序期望该属性可以作为常规POJO属性使用因为在这种情况下它使用WritableTypId.Inclusion.PAYLOAD_PROPERTY