Джексон - Как десериализовать список дочерних объектов, содержащих дополнительную оболочку - PullRequest
1 голос
/ 20 июня 2020

Проблема: Мне не удается сопоставить дочерние объекты (элементы) с продуктом. java класс из-за дополнительной оболочки.

Json:

{
"id": "1",
"desc": "Shopping",
"items": [
  {
    "product": {
      "id": 2,
      "name": "Sugar"
    }
  },
  {
    "product": {
      "id": 1,
      "name": "Flour"
    }
  }
]

}

Модель домена - Порядок (JSON Родитель):

public class Order {

private int id;

private String desc;

private Set<Product> items; 

}

Модель домена - Продукт (JSON Детский)

public class Product {

private int id;

private String name;

}

Как мне использовать jackson или любую другую json зависимость для сопоставления этой json строки с этими моделями предметной области?

Ответы [ 2 ]

2 голосов
/ 20 июня 2020
String data = "{" + 
                "\"id\": \"1\"," + 
                "\"desc\": \"Shopping\"," + 
                "\"items\": [" + 
                "  {" + 
                "    \"product\": {" + 
                "      \"id\": 2," + 
                "      \"name\": \"Sugar\"" + 
                "    }" + 
                "  }," + 
                "  {" + 
                "    \"product\": {" + 
                "      \"id\": 1," + 
                "      \"name\": \"Flour\"" + 
                "    }" + 
                "  }" + 
                "]" + 
                "}";
        
        Gson gson = new Gson();
        Order o = gson.fromJson(data, Order.class);
        System.out.println(o);

Линия делает фокус:

Order o = gson.fromJson(data, Order.class);
1 голос
/ 21 июня 2020

Вот еще одно решение, которое мне удалось найти с использованием зависимости Джексона для тех, кто не использует Gson.

In Order. java class:

public class Order {

private int id;

private String desc;

private Set<Product> items; 

private static final ObjectMapper objectMapper = new ObjectMapper();

@JsonProperty("items")
    public void setItems(List<Map<String, Object>> items) {
        for(Map<String, Object> map: items) {
            Product product = objectMapper.convertValue(map.get("product"), Product.class);
            this.addItem(product);
        }
    }

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