gpt4 book ai didi

java - Jackson 序列化映射到自定义输出列表

转载 作者:行者123 更新时间:2023-12-01 06:22:10 26 4
gpt4 key购买 nike

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

{"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> 编写一个对象。 。 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声明。

关于java - Jackson 序列化映射到自定义输出列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48567181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com