Сериализация пар ключ / значение в Джексоне? - PullRequest
8 голосов
/ 25 марта 2011

У меня есть класс

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;
}

также не работает, так как не создает достаточно кавычек.

1 Ответ

16 голосов
/ 25 марта 2011

Я нашел один способ, который использует 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{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...