gpt4 book ai didi

java - Jackson 序列化器为 Map 的子类生成无效的 Json

转载 作者:行者123 更新时间:2023-12-01 12:48:28 25 4
gpt4 key购买 nike

我有这段代码,它使用 Jackson 序列化 Map 的子类。如果没有注册序列化程序,我会得到一个有效的 json,我使用序列化程序将名称转换为小写。但是,生成的 json 如下所示:

{:"two":"aaa":"one":"aaa"}

知道为什么吗?如何修复?

@Test
public void test_serialization() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule("JSONModule", new Version(1, 0, 0, null, null, null));
module.addSerializer(Circle.class, new CircleSerializer());
module.addKeySerializer(Circle.class, new CircleSerializer());
mapper.registerModule(module);

CircleMap statistics = new CircleMap();
statistics.put(Circle.ONE, "aaa");
statistics.put(Circle.TWO, "aaa");

System.out.println(mapper.writeValueAsString(statistics));
}

enum Circle {
ONE, TWO
}

static class CircleMap extends HashMap<Circle, String> {
}

static class CircleSerializer extends JsonSerializer<Circle> {
@Override
public void serialize(Circle value, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException {
gen.writeString(value.name().toLowerCase());
}
}

最佳答案

替换

gen.writeString(value.name().toLowerCase());

gen.writeFieldName(value.name().toLowerCase());

您正在序列化 key 。这被解释为 JSON 字段名称,因此您必须使用该方法。 writeString javadoc 状态

Method for outputting a String value. Depending on context this means either array element, (object) field value or a stand alone String;

您直接写入字符串值。这不是你想要的。

请注意,您需要为键和普通值使用不同的序列化程序。

关于java - Jackson 序列化器为 Map 的子类生成无效的 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24454650/

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