jackson将地图序列化为自定义输出列表

时间:2018-02-01 16:14:27

标签: java serialization jackson

我有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
  }

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

1 个答案:

答案 0 :(得分:-2)

您目前正在为整个Map<EquipmentType, Integer>编写单个对象。 Jackson对重复JSON对象字段的行为是覆盖,因此只有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语句。