Сопоставить JSON с существующим объектом pojo - PullRequest
0 голосов
/ 15 ноября 2018

Я недавно присоединился к миру веб-сервисов и начал работать над созданием и обновлением спящих объектов, используя входные данные json.

Следующий API-интерфейс преобразует входные данные json в новый объект pojo:

Pojo newObject=mapper.readValue(jsonInput,Pojo.class);

Это хорошо работает с созданием API.

А как насчет обновления apis:

У меня большое pojo, и я не хочу вдаваться в длинный метод установки каждого значения в объект pojo из json input

я хочу что-то вроде:

Pojo existingPojo=getFromDatabase();

existingPojo=mapper.readValue(updateJsonValues,existingPojo);

saveToDatabase(existingPojo);

Таким образом, какие бы атрибуты ни имел updateJsonValues, они обновляются в существующем Pojo.

Это было бы очень полезно. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Дело в том, что это то, что ObjectMapper -подобные вещи по своей природе делают постоянно, другого пути нет: сначала создается экземпляр объекта, а затем он обновляется из JSON.
Единственное препятствие состоит в том, что для него нет ярлыка, подобного readValue() (это может быть что-то вроде updateValue()), так что это на несколько символов длиннее, вам нужно использовать readerForUpdating(), чтобы найти подходящего читателя, а затем его readValue():

import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {
    public String message="Nope";
    public String target="Nope";
    public String toString() {
        return message+" "+target+"!";
    }

    public static void main(String[] args) throws Exception {
        Test test=new Test();
        System.out.println(test);
        ObjectMapper mapper=new ObjectMapper();
        mapper.readerForUpdating(test).readValue("{\"message\":\"Hello\"}");
        System.out.println(test);
        mapper.readerForUpdating(test).readValue("{\"target\":\"World\"}");
        System.out.println(test);
    }
}

Выход:

Nope Nope!
Hello Nope!
Hello World!


Редактировать: если это необходимо повторно, читатель может быть сохранен и, конечно же, использован повторно:
ObjectReader reader=mapper.readerForUpdating(test);
reader.readValue("{\"message\":\"Hello\"}");
System.out.println(test);
reader.readValue("{\"target\":\"World\"}");
System.out.println(test);
0 голосов
/ 15 ноября 2018

У меня возник тот же вопрос, и после долгих поисков в грязи я наткнулся на библиотеку с открытым исходным кодом, MapStruct . Он помогает в отображении Java-бинов и генерирует код для вас во время загрузки вашего приложения. Это работало нормально для меня. Попробуй.

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