java - 如何使用 Jackson 序列化对象的嵌套集合

标签 java java-8 jackson jackson2

有以下代码:

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方法。

最佳答案

我建议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"

关于java - 如何使用 Jackson 序列化对象的嵌套集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49452434/

相关文章:

java - Jackson 无法识别 JSON 负载中的 @class 类型标识符

java - 将现有 WAR 部署到嵌入式 Jetty

java - 从数据库加载详细信息时出现游标错误

java - 我在 Android 上正确使用文本转语音 TTS 吗

Java 8 - 更新同一流代码中的两个属性

java - 在 Jackson 代码中打印 2 位秒数的时间戳

java - 如何测试方法是否接受参数类型?

java - 使 Struts 2 与 Java 8(遗留 ASM 3)兼容

Java : Dirty Check for ArrayList?

json - JACKSON是否支持Java泛型?