Jackson中键/值对的序列化?


问题内容

我有一堂课

class Foo {
  String key;
  String value;
}

并希望将其序列化为"<content of key>":"<content of value>"
如何实现此目标(以及如何反序列"myKey":"myVal"化为Foo对象?

我正在尝试使用

@JsonValue
public String toString() {
   return "\"" + key + "\":\"" + value + "\"";
}

但显然最终会引号过多。

@JsonValue
public String toString() {
    return key + ":" + value;
}

也不起作用,因为它不能创建足够的报价。


问题答案:

我发现了一种使用JsonSerializer的方法:

public class PropertyValueSerializer extends JsonSerializer<Foo> {

    @Override
    public void serialize(Foo property_value, JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) throws IOException, JsonProcessingException {

        jsonGenerator.writeStartObject();
        jsonGenerator.writeFieldName(property_value.getKey());
        jsonGenerator.writeString(property_value.getValue());
        jsonGenerator.writeEndObject();
    }

Foo类需要了解这一点:

@JsonSerialize(using = PropertyValueSerializer.class)
public class Foo {

反序列化非常相似:

public class PropertyValueDeserializer extends JsonDeserializer<PROPERTY_VALUE> {

    @Override
    public Foo deserialize(JsonParser jsonParser,
                                      DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        String tmp = jsonParser.getText(); // {
        jsonParser.nextToken();
        String key = jsonParser.getText();
        jsonParser.nextToken();
        String value = jsonParser.getText();
        jsonParser.nextToken();
        tmp = jsonParser.getText(); // }

        Foo pv = new Foo(key,value);
        return pv;
    }

这也需要在Foo类上进行注释:

@JsonSerialize(using = PropertyValueSerializer.class)
@JsonDeserialize(using = PropertyValueDeserializer.class)
public class Foo implements Serializable{