Jackson序列化程序为Map的子类生成无效的Json

时间:2014-06-27 14:44:25

标签: java json jackson

我有这段代码,使用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());
    }
}

1 个答案:

答案 0 :(得分:1)

替换

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

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

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

  

输出String值的方法。根据具体情况,这意味着   数组元素,(对象)字段值或独立字符串;

你是直接写字符串值。那不是你想要的。

请注意,您需要一个不同的序列化程序来处理密钥和正常值。