假设我有以下三个类(为简洁起见省略了 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
我是不是遗漏了一些小东西,还是我完全以错误的方式解决了这个问题?
注意:目前提出的一些解决方案涉及编写 InfoType1
和 InfoType2
的每个单独字段。我正在寻找不需要这个的解决方案,因为我想在具有许多字段的大型类上使用该解决方案。
最佳答案
您应该调用 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/