java - 使用 Jackson JSON 生成器,如何将多个对象写入一个字段?

标签 java json jackson jsonserializer

假设我有以下三个类(为简洁起见省略了 getter 和 setter):

@JsonAutoDetect
public class InfoCollection{
    private InfoType1 info1;
    private InfoType2 info2;
}

@JsonAutoDetect
public class InfoType1{
    private String fieldA;
}

@JsonAutoDetect
public class InfoType2{
    private String fieldB;
}

我正在尝试编写一个 JsonSerializer.serialize() 函数,以这种格式序列化一个 InfoCollection 对象:

{
    "allInfo":{
        "fieldA":"foo",
        "fieldB":"bar"
    }
}

这是我现在拥有的:

jsonGenerator.writeStartObject();
jsonGenerator.writeFieldName("allInfo");
jsonGenerator.writeObject(myInfoCollection.getInfo1());
jsonGenerator.writeObject(myInfoCollection.getInfo2());
jsonGenerator.writeEndObject();

导致以下异常:

 org.codehaus.jackson.JsonGenerationException: Can not start an object, expecting field name

我是不是遗漏了一些小东西,还是我完全以错误的方式解决了这个问题?

注意:目前提出的一些解决方案涉及编写 InfoType1InfoType2 的每个单独字段。我正在寻找不需要这个的解决方案,因为我想在具有许多字段的大型类上使用该解决方案。

最佳答案

您应该调用 writeObjectFieldStart("allInfo") 而不是调用 writeFieldName("allInfo"),因为“allInfo”是另一个 JSON 对象。因此,您的自定义序列化程序应如下所示:

public void serialize(InfoCollection infoCollection, JsonGenerator jgen, SerializerProvider provider) throws IOException{
    jgen.writeStartObject();
    jgen.writeObjectFieldStart("allInfo");
    jgen.writeObjectField("fieldA", infoCollection.getInfo1().getFieldA());
    jgen.writeObjectField("fieldB", infoCollection.getInfo2().getFieldB());
    jgen.writeEndObject();
    jgen.writeEndObject();
}

或者您可以尝试基于注解的方法:

@JsonRootName("allInfo")
public class InfoCollection {
    @JsonUnwrapped
    private InfoType1 info1;
    @JsonUnwrapped
    private InfoType2 info2;

    /* getters, setters */
}

(您需要启用 SerializationConfig.Feature.WRAP_ROOT_VALUE 功能才能使其正常工作。参见 Serialization features)

关于java - 使用 Jackson JSON 生成器,如何将多个对象写入一个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14835952/

相关文章:

java - AspectJ 和 PostSharp 之间的功能差异是什么?

java - 在java中翻转标志的计数器

javascript - 清理标记的 JSON 响应

Android Retrofit 2.0 刷新 token

java - jackson 序列化: String field containing regex expression de-escaping to get actual literal

java - 如何重定向 Groovy 脚本的输出?

java - 使用线程池同步银行java

c++ - 将 JSON 对象存储到 C++ 映射

json - Bash 解析 JSON 对象 jsawk

java - Hibernate 和 JSON - 循环依赖有明确的解决方案吗?