杰克逊用对象的“伪数组”反序列化json字符串

时间:2018-05-03 23:53:45

标签: java json jackson

我正在尝试从此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/"));

但有没有办法自动将这些映射到List?

2 个答案:

答案 0 :(得分:2)

您可以将其解析为地图(如@teppic所说),然后将地图值作为列表获取。

要反序列化到地图中,您可以看到此问题的答案:Deserializing into a HashMap of custom objects with jackson

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

假设您有一个名为Item的课程,其中包含idname字段,您可以这样做:

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]]

您的其他选项是自定义反序列化程序,或者如您所述阅读树。

答案 1 :(得分:-1)

试试这个

String json =&#34; [{\&#34; name \&#34;:\&#34; Steve \&#34;,\&#34; lastname \&#34;:\& #34;工作\&#34;}]&#34 ;; JsonArray jArray =(JsonArray)new JsonParser()。parse(json);

String sName = jArray.get(0).getAsJsonObject()。get(&#34; name&#34;)。getAsString()); String sLastName = jArray.get(0).getAsJsonObject()。get(&#34; lastname&#34;)。getAsString());

稍后见。