繁体   English   中英

杰克逊将地图序列化到自定义输出列表

[英]jackson serialize map to a list of customized output

我有一个Map<EquipmentType, Integer> equipment来存储设备数量。 我想将此地图序列化为

{"equipment":
  [
    {"equipmentType":{},"quantity": 0},
     ...
  ]
}

我有一个定制的序列化器

public void serialize(Map<EquipmentType, Integer> value, JsonGenerator gen, SerializerProvider provider) throws IOException {
    gen.writeStartObject();
    value.entrySet().forEach(entry -> {
        try {
            gen.writeObjectField("equipmentType", entry.getKey());
            gen.writeNumberField("quantity", entry.getValue());
        } catch (IOException e) {
            e.printStackTrace();
        }
    });
    gen.writeEndObject();
}

但是它只写一个入口集。

"equipment" : 
  {
    "equipmentType" : {},
    "quantity" : 1
  }

如何将条目集连接到列表?

您目前正在为整个Map<EquipmentType, Integer>编写一个对象。 对于重复的JSON对象字段,Jackson的行为将被覆盖,因此只有Map的最后一个条目将被写入为您正在写入的单个JSON对象。

您将要启动一个JSON数组,将每个条目写为一个对象,然后关闭该数组。

例如,

public void serialize(Map<EquipmentType, Integer> value, JsonGenerator gen, SerializerProvider provider)
        throws IOException {
    gen.writeStartArray();
    value.entrySet().forEach(entry -> {
        try {
            gen.writeStartObject();
            gen.writeObjectField("equipmentType", entry.getKey());
            gen.writeNumberField("quantity", entry.getValue());
            gen.writeEndObject();
        } catch (IOException e) {
            e.printStackTrace();
        }
    });
    gen.writeEndArray();
}

但是,您也应该摆脱forEach 使用常规for语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM