有以下代码:
public class ToSerialize {
List<NestedObject> objs;
public ToSerialize(List<NestedObject> objs) {
this.objs = objs;
}
}
public class NestedObject {
int intValue = 0;
String strValue = "Hello world";
}
如果可能的话,如何设置 Jackson,以便获得以下 CSV 作为字符串输出:
obj1.intValue,obj1.strValue,obj2.intValue,obj2.strValue,0,"Hello world",0,"Hello world"
我考虑编写自己的自定义 JsonSerializer
但无法弄清楚。不过,这是我当前无法正常工作的序列化器实现
@Override
public void serialize(List<NestedObject> values, JsonGenerator gen, SerializerProvider serializers)
throws IOException
{
int i = 1;
for (Iterator<VsppAssetEntry> iterator = values.iterator(); iterator.hasNext(); ) {
VsppAssetEntry entry = iterator.next();
String fieldName = "obj" + i;
gen.writeObjectField(fieldName, entry);
i++;
}
这会抛出com.fasterxml.jackson.core.JsonGenerationException:无法写入字段名称,需要一个值
显然是因为Jackson在输入此之前写了一个fieldNameobjs
方法。
最佳答案
考虑以下 CSV 架构:
CsvSchema schema = CsvSchema.builder()
.addColumn("obj")
.addColumn("intValue")
.addColumn("strValue")
.build()
.withHeader();
ToSerialize toSerialize = new ToSerialize(Arrays.asList(new NestedObject(), new NestedObject()));
String csv = new CsvMapper()
.writerFor(ToSerialize.class)
.with(schema)
.writeValueAsString(toSerialize);
System.out.println(csv);
以及以下自定义序列化器...
public class ToSerializeSerializer extends JsonSerializer<ToSerialize> {
@Override
public void serialize(ToSerialize toSerialize, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
List<NestedObject> objs = toSerialize.getObjs();
for (int i = 0; i < objs.size(); i++) {
gen.writeObject("obj" + i);
gen.writeObject(objs.get(i));
}
}
}
…在您的 ToSerialize
类上注册它…
@JsonSerialize(using = ToSerializeSerializer.class)
public class ToSerialize {
[…]
}
...它会给你...
obj,intValue,strValue
obj0,0,"Hello world"
obj1,0,"Hello world"
关于java - 如何使用 Jackson 序列化对象的嵌套集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49452434/