【问题标题】:How to serialize nested collection of objects with Jackson如何使用 Jackson 序列化嵌套的对象集合
【发布时间】:2018-03-23 14:49:54
【问题描述】:

有以下代码:

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: Can not write a field name, expecting a value,显然是因为Jackson在进入这个方法之前写了一个fieldNameobjs

【问题讨论】:

  • 杰克逊并不是真的打算使用这种方法。有专门为这些设计的 csv 处理框架,即 opencsv

标签: java java-8 jackson jackson2


【解决方案1】:

我建议Jackson dataformat CSV

考虑以下 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2019-05-20
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多