Java jackson将映射序列化为自定义输出列表

Java jackson将映射序列化为自定义输出列表,java,serialization,jackson,Java,Serialization,Jackson,我有一个映射设备来存储设备数量。 我想将此地图序列化为 {"equipment": [ {"equipmentType":{},"quantity": 0}, ... ] } 我有一个定制的序列化程序 public void serialize(Map<EquipmentType, Integer> value, JsonGenerator gen, SerializerProvider provider) throws IOException {

我有一个
映射设备
来存储设备数量。 我想将此地图序列化为

{"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();
}

如何将入口集连接到列表?

您当前正在为整个
映射编写单个对象。Jackson对重复JSON对象字段的行为是覆盖,因此只有
映射中的最后一个条目将作为您正在编写的单个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();
}
public void serialize(映射值、JsonGenerator gen、SerializerProvider提供程序)
抛出IOException{
WriteStartaray将军();
value.entrySet().forEach(条目->{
试一试{
gen.writeStartObject();
gen.writeObject字段(“设备类型”,entry.getKey());
gen.writeNumberField(“数量”,entry.getValue());
writeEndObject将军();
}捕获(IOE异常){
e、 printStackTrace();
}
});
writeEndArray将军();
}

但是,您也应该摆脱forEach的
forEach
。对
语句使用正常的

它是否多次执行lambda?
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();
}