java - 与 jackson 重复 JSON 字段

标签 java json jackson

我正在结合 Spring 使用 Jackson 进行 JSON(反)序列化。但是,在某些情况下,我遇到了一个字段两次的问题。

我有一个抽象类:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "mimeType")
@JsonSubTypes({
    @JsonSubTypes.Type(value = ImageBookmarkJsonModel.class, name = "image/jpeg"),
    @JsonSubTypes.Type(value = EpubBookmarkJsonModel.class, name = "application/epub+zip")
})
public abstract class AbstractBookmarkJsonModel extends AbstractJsonModel {
    protected String mimeType;
    // Removed other fields for brevity

    public String getMimeType() {
        return mimeType;
    }

    public void setMimeType(String mimeType) {
        this.mimeType = mimeType;
    }

    @Override
    public String toString() {
        ObjectMapper mapper = new ObjectMapper();

        try {
            return mapper.writeValueAsString(this);
        } catch (IOException e) {
            throw new IllegalStateException("Cannot convert object of type " + this.getClass().toString() + " to JSON", e);
        }
    }
}

一个具体的类扩展了抽象:

public class EpubBookmarkJsonModel extends AbstractBookmarkJsonModel {
    private static final long serialVersionUID = 1L;
    // Removed other fields for brevity

    public EpubBookmarkJsonModel() {
        this.mimeType = "application/epub+zip";
    }
}

问题是当我序列化这个 JSON 时,我得到一个重复的 mimeType 字段:

{
  "mimeType": "application/epub+zip",
  "mimeType": "application/epub+zip",
  "userId": 24,
  "acid": "ACID-000000000029087",
  "added": "2013-08-14T12:02:17Z",
  "epubBookmarkId": 34,
  "cfi": "epubcfi(/6/4!/2/68)",
  "context": "CONTEXT"
}

我已尝试使用 previous 的建议answers使用 @JsonAutoDetect 注释来指定只应使用类上的字段以及在 ObjectMapper 上设置相同的字段,但这并不能解决问题。

注释:

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE,
        setterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE,
        isGetterVisibility = JsonAutoDetect.Visibility.NONE)

对象映射器:

    ObjectMapper mapper = new ObjectMapper();
    mapper.getSerializationConfig().getDefaultVisibilityChecker()
            .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
            .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withCreatorVisibility(JsonAutoDetect.Visibility.NONE);

最佳答案

我通过在 @JsonTypeInfo 注释中使用 JsonTypeInfo.As.EXISTING_PROPERTY 解决了这个问题。

该项目是开源的,请在此处查看:ANS.java

关于java - 与 jackson 重复 JSON 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18237222/

相关文章:

javascript - django rest框架上传文件

javascript - 读取已解析的 JSON 响应

json - 如何在 shell 脚本中漂亮地打印 JSON?

java - 来自 Android 应用程序的发布请求失败 + RestEasy + Jackson

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 如何通过 Controller POST 请求更新 View 中的某些属性

java - JSON/ jackson : Recursive polymorphic deserialization without type field

java - Jackson 序列化程序在序列化后不显示 jsonInfoType

java - 数组序列化使用 Jackson 给出合格的类名称

java - 这个概念叫什么,来自哪个版本的java