Джексон: десериализация массива JSON из объекта JSON в список Java - PullRequest
0 голосов
/ 14 октября 2019

Я оступился на некоторое время. У меня есть приложение Spring, и я хотел бы проанализировать следующий JSON:

{
  "metadata": {...}
  "response": {
    "objects": [
      {
        "name": "someName",
        "properties": [<array_of_properties>]
      },
      ...
    ]
  }
}

в список следующих объектов Java:

public class MyClass {
  String name;
  List<CustomProperties> customProperties;
}

То есть я хочу извлечь только objects массив и разбирать только это. Я пытался использовать пользовательский десериализатор, и это работает, но мне пришлось сделать:

@JsonDeserialize(using=MyDeserializer.class)
public class MyClassList extends ArrayList<MyClass>{}

, а затем:

ObjectMapper objectMapper = new ObjectMapper();
List<MyClass> list = objectMapper.readValue(json, MyClassList.class) 

Есть ли способ избежать расширения ArrayList, так как в настоящее времяЯ делаю это для того, чтобы получить доступ к свойству .class.

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Вы можете сделать что-то вроде этого. Я чувствую, что это будет чище

@JsonIgnoreProperties(ignoreUnknown = true)
class Wrapper{
  private Response response;
  //setters, getters
}

@JsonIgnoreProperties(ignoreUnknown = true)
class Response{
  private List<MyClass> objects;
  //setters, getters
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyClass {
  String name;
  List<CustomProperties> customProperties;
  //setters, getters
}

ObjectMapper objectMapper = new ObjectMapper();
Wrapper wrapper = objectMapper.readValue(json, Wrapper.class) 

Вы можете извлекать объекты и, следовательно, CustomProperties, просматривая список. Вы можете объявить только те поля, которые вас интересуют, и игнорировать другие с помощью @JsonIgnoreProperties(ignoreUnknown = true) (например, я не включил метаданные)

1 голос
/ 14 октября 2019

вы можете определить свою структуру json с помощью пары классов

public class MyJson {
  private MyResponse response;
  ...
}

public class MyResponse {
  private List<MyClass> objects;
  ...
}

public class MyClass {
  String name;
  List<CustomProperty> customProperties;
  ...
}

, чем вы можете использовать Джексона для анализа строки json в MyJson классе, никаких специальных @JsonDeserialize не требуется

ObjectMapper objectMapper = new ObjectMapper();
MyJson myJson = objectMapper.readValue(json, MyJson.class);
List<MyClass> list =  myJson.getResponse().getObjects();

Имейте в виду, этот код является всего лишь черновиком, все классы должны иметь сеттеры (и геттеры), и требуются некоторые нулевые проверки

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