我希望使用GSON从JSON Feed创建ArrayList
个自定义对象。我当前的方法适用于包含数组的单个JSON对象,但现在我需要解析更复杂的JSON对象。第一个JSON提要看起来像这样:
{"data":
{"item_id": "1", "element": "element1"}
{"item_id": "2", "element": "element2"}
{"item_id": "3", "element": "element3"}
...
}
我提取每个项目的方法是使用一个简单的自定义对象,并将JSON解析为这些对象的ArrayList
。
InputStreamReader input = new InputStreamReader(connection.getInputStream());
Type listType = new TypeToken<Map<String, ArrayList<CustomObject>>>(){}.getType();
Gson gson = new GsonBuilder().create();
Map<String, ArrayList<CustomObject>> tree = gson.fromJson(input, listType);
ArrayList<CustomObject> = tree.get("data");
当前的JSON对象如下所示:
{"rate_limit": 1, "api_version": "1.2", "generated_on": "2015-11-05T19:34:06+00:00", "data": [
{"collection": [
{"item_id": "1", "time": "2015-11-05T14:40:55-05:00"},
{"item_id": "2", "time": "2015-11-05T14:49:09-05:00"},
{"item_id": "3", "time": "2015-11-05T14:51:55-05:00"}
], "collection_id": "1"},
{"collection": [
{"item_id": "1", "time": "2015-11-05T14:52:01-05:00"},
{"item_id": "2", "time": "2015-11-05T14:49:09-05:00"},
{"item_id": "3", "time": "2015-11-05T14:51:55-05:00"}
], "collection_id": "2"
]}
由于混合类型的数据,我在解析它时遇到问题,有些是数字,字符串和最后的数组。我有一个自定义对象,它采用另一个自定义对象的数组。这是集合对象:
public class CustomCollection {
private String collection_id;
private ArrayList<CustomItem> collection_items = new ArrayList<>();
public CustomCollection() {
this(null, null);
}
public CustomCollection(String id, ArrayList<CustomItem> items) {
collection_id = id;
collection_items = items;
}
public String getId() {
return collection_id;
}
public ArrayList<CustomItem> getItems() {
return collection_items;
}
}
这是项目对象:
public class CustomItem {
private String item_id;
private String item_element;
public CustomItem() {
this(null, null);
}
public CustomItem(String id, String element) {
item_id = id;
item_element = element;
}
public String getId() {
return item_id;
}
public String getElement() {
return item_element;
}
}
我并不真正关心获取其他元素(即&#34; rate_limit&#34;,&#34; api_version&#34;,&#34; generated_on&#34;),我只想传递& #34;数据&#34;元素到ArrayList
个对象。但是当我尝试类似于原始方法的东西时,解析器会停止第一个对象,因为它接收的是数字而不是数组。导致IllegalStateException: Expected BEGIN_ARRAY but was NUMBER at line 1 column 17 path $.
。我想知道如何让解析器忽略其他元素,或者如何使用GSON分别获取每个元素。
编辑:我在Ignore Fields When Parsing JSON to Object找到的问题解决方案在技术上确实解决了我的问题。但这似乎是一个漫长的过程,在我的案例中是不必要的。我找到了一个更简单的解决方案来解决我的问题,请在下面的答案中找到。我也不确定这种方法是否适用于上述问题,考虑到似乎没有办法在GSON中通过密钥名称从JsonObject
获得JsonArray
。
答案 0 :(得分:0)
我找到的解决方案是将数据解析为com.google.gson.JsonObject
,然后按密钥名称解析为JsonArray
。然后,我可以将此JsonArray
用作Gson.fromJson()
中的参数,将数据提取到ArrayList
个自定义对象中。
InputStreamReader input = new InputStreamReader(connection.getInputStream());
JsonArray data = new JsonParser().parse(input).getAsJsonObject().getAsJsonArray("data");
Type listType = new TypeToken<ArrayList<CustomCollection>>(){}.getType();
ArrayList<CustomCollection> collection = new Gson().fromJson(data, listType);
input.close();
此方法忽略所有其他JSON字段,仅获取指定的JSON字段。它还从&#34;数据中获取对象数组。对象并将它们放入ArrayList
中的CustomCollection
个自定义对象中。