gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:26:54 25 4
gpt4 key购买 nike

假设我有以下三个类(为简洁起见省略了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com