使用Gson嵌套Json解析

时间:2014-07-18 10:58:48

标签: android json gson

我曾尝试使用gson解析此JSON,但我无法解析。 任何人都可以帮助我使用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));

3 个答案:

答案 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来维护键值对的层次结构

答案 1 :(得分:1)

您可以在此处生成您的pojos:http://www.jsonschema2pojo.org/

有时gson无法从json转换对象。在这种情况下,您必须编写自己的反序列化器并将其与gson builder一起使用。

编辑:如果你在发布你的项目之前使用proguard(如果你设置proguard来改变你的pojos变量名)gson不能匹配类变量名,json名,所以它不能转换你的对象。您必须添加@SerializedName(“your_variable_name”)注释。

答案 2 :(得分: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();
}