Как Джексон сериализует карту с помощью пользовательских методов получения / установки? - PullRequest
1 голос
/ 26 января 2012

У меня есть компонент в Джексоне, который использует метод @JSonAnySetter для хранения всех неизвестных параметров на карте.

@JSonAnySetter
handleUnkowns(String k, Object v) 
{
   myMap.put(k,v); 
}

Я использую это как "Базовый компонент" для всех моих типов данных, так что, если данные отсутствуют, заполняются неизвестные параметры и данные не теряются ...., а не происходит падение Джексона.

Однако я хочу, чтобы сериализованная форма этих неизвестных НЕ была вложенной, то есть я хочу, чтобы сериализованные параметры находились на верхнем уровне объекта, когда объект сериализуется. Кроме того, я хочу, чтобы настраиваемые поля также были сериализованы:

//I want this map to be serialized/deserialized : {"collarWidth":10 "name":"fido"}
class Dog extens JSonBean 
{
     int collarWidth=0;
     getCollarWidth(){return collarWidth;}
     setCollarWidth(int x){collarWidth=x;}
}

Обратите внимание, что в приведенном выше случае - поскольку я расширяюсь от карты, произойдет пользовательская сериализация карты Джексона, и unknownParameters будет "полем" в моем json.

Таким образом, ожидаемая сериализация JSON будет
{"collarWidth": 10 "unknownParameters": {"name": "fido"}}

вместо

{"collarWidth": 10 "name": "fido"}

Итак, как проще всего «объединить» неизвестные параметры с известными, чтобы сериализатор Java-бинов сохранил ту же вложенность, что и входная строка?

Очевидное решение состоит в том, чтобы объединить параметры объекта "myMap" с сериализованной картой, но это кажется излишним, и я предполагаю, что эта проблема может иметь более элегантное решение.

1 Ответ

1 голос
/ 26 января 2012

Вы проверяли @JsonAnyGetter аннотацию?Карта, возвращаемая этим методом, будет развернута, чтобы она работала с @JsonAnySetter. Эта запись в блоге объясняет использование.

...