Как создать бобы в обычай с Джексоном? - PullRequest
8 голосов
/ 18 апреля 2011

Каков наилучший и самый простой способ создания экземпляров bean-компонентов нестандартным способом (без вызова конструктора по умолчанию) при десериализации из JSON с использованием библиотеки Джексона?Я обнаружил, что есть интерфейс JsonDeserializer, который я мог бы реализовать, но я не очень уверен, как связать все это вместе в ObjectMapper.

ОБНОВЛЕНИЕ # 1 : Iдумаю, что некоторые детали требуются для моего вопроса.По умолчанию десериализатор Джексона использует конструктор по умолчанию для создания бинов.Я хотел бы иметь возможность реализовать создание экземпляра bean-компонента путем вызова внешней фабрики.Так что мне нужен просто класс бина, который нужно создать.Фабрика вернет экземпляр, который затем может быть предоставлен Джексону для заполнения свойств и т. Д.

Обратите внимание, что меня не волнует создание простых / скалярных значений, таких как строки или числа, только биныв области моих интересов.

Ответы [ 2 ]

8 голосов
/ 19 апреля 2011

Некоторые вещи, которые могут помочь ...

Во-первых, вы можете использовать @JsonCreator для определения используемого альтернативного конструктора (все аргументы должны быть аннотированы с помощью @JsonProperty, потому что байт-код не имеет имен), или статической фабрики.,Он по-прежнему будет частью класса значений, но может помочь в поддержке неизменяемых объектов.

Во-вторых, если вы хотите действительно настраиваемый процесс десериализации, вы можете проверить http://wiki.fasterxml.com/JacksonHowToCustomDeserializers, который объясняет, как регистрировать настраиваемые десериализаторы.

Одна вещь, которую Джексон в настоящее время упускает, - это поддержка объектов в стиле конструктора;есть запрос на добавление поддержки (и планируется добавить поддержку в будущем, когда у разработчиков будет время).

0 голосов
/ 18 апреля 2011

Вы помещаете десериализатор в объект Java, в который хотите отобразить json:

@JsonDeserialize(using = PropertyValueDeserializer.class)
public class PROPERTY_VALUE implements Serializable{

и затем в десериализаторе вы можете, например, сделать:

@Override
public PROPERTY_VALUE 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(); // }

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

Если вы не хотите использовать аннотации, вам нужно передать мапперу DeserializerProvider, который может предоставить правильный десериализатор для данного типа.

mapper.setDeserializerProvider(myDeserializerProvider);

Для конструкторов - конечно, вы можете создать целевой класс, вызвав фабрику в десериализаторе:

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

    MyObject pv = MyObjectFactory.get(key);
    pv.setValue(value);
    return pv;
}

Но тогда я мог неправильно понять ваше обновление

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...