Json Java Binding для нескольких POJO - PullRequest
0 голосов
/ 04 июня 2018

Можно ли проанализировать JSON, содержащий несколько объектов, с помощью ObjectMapper?Например,

{
  "employee": {
    "name": "John",
    "surname": "Smith",
    "age": 30,
    "department": "sales"
  },
  "department": {
    "name": "sales",
    "company": "abcd",
    "lead": "Mr Harrison"
  },
  "company": {
    "name": "abcd",
    "location": "New York"
  }
}

Могу ли я получить объекты Employee, Department, Company из этого файла за один прогон отображения, что-то вроде:

ObjectMapper mapper = new ObjectMapper(); List of Objects = mapper.readValue(...)

Илиэто не возможно?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Если мы рассмотрим случай

чтения множества объектов в одном файле отдельно

, без создания выделенной оболочки POJO, этого также можно достичь при условиичто у вас есть информация о том, какой тип целевого объекта должен быть сопоставлен каждому из ключей корневого уровня в JSON.

Эта информация может быть представлена ​​в виде Map:

Map<String, Class<?>> targetTypes = new HashMap<>();
targetTypes.put("employee", Employee.class);
targetTypes.put("department", Department.class);
targetTypes.put("company", Company.class);

Десериализация должна быть выполнена в два этапа.Первый - преобразовать исходный JSON в Map<String, Object>:

String json = ... // the JSON
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> parsed = mapper.readValue(json, Map.class);

Второй шаг - сопоставить ключи этой карты с целевыми типами и преобразовать значения в объекты:

List<Object> objects = parsed.entrySet().stream().map(
    (entry) -> {
      Class<?> targetClass = targetTypes.get(entry.getKey());
      return mapper.convertValue(entry.getValue(), targetClass);
    }
).collect(Collectors.toList());

Список objects теперь содержит

[
 Employee(name=John, surname=Smith, age=30, department=sales), 
 Department(name=sales, company=abcd, lead=Mr Harrison), 
 Company(name=abcd, location=New York)
]
0 голосов
/ 04 июня 2018

Создайте родительский объект, который содержит 3 объекта, которые вы ищете, и прочитайте их в этот единственный объект, а затем используйте этот объект для доступа к вашим данным.

...