使用@JsonTypeInfo属性发生意外的重复键错误

时间:2013-07-17 16:35:01

标签: json jackson

我有一个简单的数据对象层次结构,必须转换为JSON格式。像这样:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "documentType")
@JsonSubTypes({@Type(TranscriptionDocument.class), @Type(ArchiveDocument.class)})
public class Document{
  private String documentType;
  //other fields, getters/setters
}

@JsonTypeName("ARCHIVE")
public class ArchiveDocument extends Document { ... }

@JsonTypeName("TRANSCRIPTIONS")
public class TranscriptionDocument extends Document { ... }

在JSON解析时,我遇到类似这样的错误: Unexpected duplicate key:documentType at position 339.,因为在生成的JSON中实际上有两个documentType字段。

如果JsonTypeName字段中显示documentType值,应该更改哪些内容没有错误(例如替换其他值)?

杰克逊版本为2.2

1 个答案:

答案 0 :(得分:2)

您的代码没有显示,但我打赌您的Document类中有documentType属性的getter。您应该使用@JsonIgnore注释此getter,如下所示:

@JsonIgnore
public String getDocumentType() {
    return documentType;
}

有一个与每个子类关联的隐式documentType属性,因此在父类中具有相同的属性会导致它被序列化两次。

另一种选择是完全删除getter,但我认为你可能需要它用于某些业务逻辑,因此@JsonIgnore注释可能是最好的选择。