2014-07-18 163 views
0

我试图解析这个JSON使用gson,但我不能。 任何人都可以帮助我解析这个JSON使用gson使用Gson嵌套的Json解析

JSON:

{ 
    "status": "ok", 
    "results": { 
     "favourites": [ 
      { 
       "id": "UB3172", 
       "name": "Masdar Headquarters" 
      }, 
      { 
       "id": "UB1438", 
       "name": "Guggenheim Abu Dhabi on Saadiyat Island" 
      }, 
      { 
       "id": "UB4838", 
       "name": "Watani Residential Development in Abu Dhabi - 600 Villas and 48 Buildings" 
      }, 
      { 
       "id": "UB4795", 
       "name": "Two Mosques in Mohammed Bin Zayed City" 
      }, 
      { 
       "id": "UB1274", 
       "name": "2 Workers Residential City at Al Ain Industrial City" 
      } 
     ] 
    } 
} 

我想这一个JSON解析器类:

public class ProjectList { 
    public String status; 
    public String results; 

    public class Favourites{ 
    public String id; 
    public String name; 
    } 

} 

在MainActivit

Reader reader = new InputStreamReader(result); 
     Gson gson=new Gson(); 
     List<ProjectList.Favourites> fav=new ArrayList<ProjectList.Favourites>(); 
     fav=Arrays.asList(gson.fromJson(reader, ProjectList.Favourites.class)); 
+0

你有没有尝试过。 –

+0

是的..我已经试过 – Ansar

+0

你可以发布你的代码。 –

回答

2

创建一个POJO类如下

class MyResponse { 
     public String status; 

     public Result results; 

     public static class Favourites { 

      public String id; 
      public String name; 
     } 

     public static class Result { 

      public List<Favourites> favourites; 
     } 

    } 

,并把它传递给GSON作为

MyResponse response = new Gson().fromJson(yourResponse, MyResponse.class); 

想法是保持键值对的层次结构与相应的POJO的

+0

我认为类应该是公共的,不要忘记编辑proguard obfucator(如果涉及)... :) – Trinimon

+0

我是如何检索这些id和名称使用这个类。 – Ansar

+0

使内部类公共静态看到编辑答案 – NullPointerException

1

你可以在这里生成你的POJO:http://www.jsonschema2pojo.org/

有时gson不能从json转换你的对象。在这种情况下,您必须编写自己的解串器并将其与gson builder一起使用。编辑:如果您在发布您的项目之前使用了proguard(如果您设置了proguard来更改您的pojos变量名称),则gson不能匹配类变量名称,json名称,因此它无法转换您的对象。您必须添加@SerializedName(“your_variable_name”)注释。

+0

+1重要的东西 – NullPointerException

0

试试这种方式,希望这会帮助你解决你的问题。

String jsonRespone = "{\"status\":\"ok\",\"results\":{\"favourites\":[{\"id\":\"UB3172\",\"name\":\"Masdar Headquarters\"},{\"id\":\"UB1438\",\"name\":\"Guggenheim Abu Dhabi on Saadiyat Island\"},{\"id\":\"UB4838\",\"name\":\"Watani Residential Development in Abu Dhabi - 600 Villas and 48 Buildings\"},{\"id\":\"UB4795\",\"name\":\"Two Mosques in Mohammed Bin Zayed City\"},{\"id\":\"UB1274\",\"name\":\"2 Workers Residential City at Al Ain Industrial City\"}]}}"; 

String status; 
ArrayList<HashMap<String,String>> favouritesList = new ArrayList<HashMap<String, String>>(); 

try{ 
    JSONObject responseJson = new JSONObject(jsonRespone); 
    status = responseJson.getString("status"); 

    JSONArray favouriteJsonArray = responseJson.getJSONObject("results").getJSONArray("favourites"); 

    for (int i=0;i<favouriteJsonArray.length();i++){ 
     HashMap<String,String> favourite = new HashMap<String, String>(); 
     favourite.put("id",favouriteJsonArray.getJSONObject(i).getString("id")); 
     favourite.put("name",favouriteJsonArray.getJSONObject(i).getString("name")); 
     favouritesList.add(favourite); 
    } 

    System.out.print("status : "+status); 
    for (HashMap<String, String> favourite : favouritesList) { 
     System.out.print("id : "+favourite.get("id")); 
     System.out.print("name : "+favourite.get("name")); 
    } 
}catch (Throwable e){ 
    e.printStackTrace(); 
}