我有这段代码,使用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());
}
}
答案 0 :(得分:1)
替换
gen.writeString(value.name().toLowerCase());
与
gen.writeFieldName(value.name().toLowerCase());
您正在序列化密钥。这被解释为JSON字段名称,因此您必须使用该方法。 writeString
javadoc陈述
输出String值的方法。根据具体情况,这意味着 数组元素,(对象)字段值或独立字符串;
你是直接写字符串值。那不是你想要的。
请注意,您需要一个不同的序列化程序来处理密钥和正常值。