Джексон десериализует строку json с помощью «псевдомассива» объектов - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь прочитать данные из этого API https://coinmarketcap.com/api/

Для этой конечной точки https://api.coinmarketcap.com/v2/ticker/. У меня проблемы с отображением поля данных в POJO. Поле действительно содержит массив объектов, но с точки зрения json оно на самом деле не определяется как массив.

т.е. вместо

data: [{"id":"1","name":"some object"},{"id":"5","name":"another object"},...]

JSON назвал такие поля как

data: {"1":{"id":"1","name":"some object"},"5":{"id":"5","name":"another object"},...}

Я могу разобрать это вручную, используя

objectMapper.readTree(new URL("https://api.coinmarketcap.com/v2/ticker/"));

но есть ли способ автоматически сопоставить их со списком?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

попробуйте

String json = "[{\" name \ ": \" Steve \ ", \" lastname \ ": \" Jobs \ "}]"; JsonArray jArray = (JsonArray) new JsonParser (). Parse (json);

String sName = jArray.get (0) .getAsJsonObject (). Get ("name"). GetAsString ()); String sLastName = jArray.get (0) .getAsJsonObject (). Get ("фамилия"). GetAsString ());

увидимся позже.

0 голосов
/ 04 мая 2018

Вы можете разобрать его на карту (как сказал @teppic) и затем получить значения карты в виде списка.

Чтобы десериализовать в карту, вы можете увидеть ответ на этот вопрос: Десериализация в HashMap пользовательских объектов с Джексоном

TypeFactory typeFactory = mapper.getTypeFactory();
MapType mapType = typeFactory.constructMapType(HashMap.class, String.class, Theme.class);
HashMap<String, Theme> map = mapper.readValue(json, mapType);

Предполагая, что у вас есть класс с именем Item с полями id и name, вы можете сделать это:

String json = "{\"1\":{\"id\":\"1\",\"name\":\"some object\"},\"5\":{\"id\":\"2\",\"name\":\"another object\"}}";

ObjectMapper mapper = new ObjectMapper();

// create your map type <String, Item>
TypeFactory typeFactory = mapper.getTypeFactory();
MapType mapType = typeFactory.constructMapType(HashMap.class, String.class, Item.class);
HashMap<String, Item> map = mapper.readValue(json, mapType);

// get the list
List<Item> list = new ArrayList<Item>(map.values());

System.out.println(list);

Выход:

[Item [id=1, name=some object], Item [id=2, name=another object]]

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

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