问题:从Foursquare Venues API解析以下响应:
{
meta: {
code: 200
}
notifications: [
{
type: "notificationTray"
item: {
unreadCount: 0
}
}
]
response: {
venues: [
{
id: "5374fa22498e33ddadb073b3"
name: "venue 1"
},
{
id: "5374fa22498e33ddadb073b4"
name: "venue 2"
}
],
neighborhoods: [ ],
confident: true
}
}
GSON documentation网站建议使用GSON的解析API将响应解析为JSONArray,然后将每个数组项读入适当的对象或数据类型(示例here)。因此,我最初切换到以下实现:
JsonParser parser = new JsonParser();
try {
JSONObject json = new JSONObject(response);
JSONArray venues = json.getJSONObject("response").getJSONArray("venues");
int arraylengh = venues.length();
for(int i=0; i < arraylengh; i++){
Log.d(TAG, "The current element is: " + venues.get(i).toString());
}
}
catch(JSONException e){
}
上面的代码给了我一个带有所有“场地”的JSONArray。接下来的问题是我不知道如何将“场地”JSONArray解析/转换为ArrayList(对于我的自定义Venue对象)。
解决方案如JohnUopini所述,通过使用以下实现,我能够成功解析JSON:
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
JsonParser parser = new JsonParser();
JsonObject data = parser.parse(response).getAsJsonObject();
Meta meta = gson.fromJson(data.get("meta"), Meta.class);
Response myResponse = gson.fromJson(data.get("response"), Response.class);
List<Venue> venues = Arrays.asList(myResponse.getVenues());
使用上面的代码,我能够成功地将“meta”以及“response”JSON属性解析为我的自定义对象。
作为参考,下面是我的Response类(注意:为了测试目的,属性被定义为public。最终实现应该将这些属性声明为private并使用setter / getters进行封装):
public class Response {
@SerializedName("venues")
public Venue[] venues;
@SerializedName("confident")
public boolean confident;
Response(){}
}
注意/反馈:在实施接受的答案建议后,我在调试过程中遇到过以下(或类似)异常消息:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected STRING but was BEGIN_OBJECT
我得到上述异常的原因是因为“场地”JSON中某些孩子的“类型”与我在自定义Venue类中定义此类对象的“类型”不匹配。确保自定义类中的类型与JSON具有一对一的对应关系(即[]是数组属性,{}是Object属性等)。
答案 0 :(得分:3)
这是正确的,因为您尝试访问的对象不是数组,您应该执行以下操作:
JsonParser parser = new JsonParser();
JsonObject data = parser.parse(response).getAsJsonObject();
Meta meta = gson.fromJson(data.get("meta"), Meta.class);
Response myResponse = gson.fromJson(data.get("response"), Response.class);
或者您可以为3个对象创建一个包含3个类的对象,然后通过GSON解析所有内容。