Android 关于 Json解析的几种方法



首先说明一点, json 格式的数据如果用 { } 包含的是一个对象,用 [ ] 包含的是一个数据

示例接口

https://api.douban.com/v2/movie/top250?start=0&count=2

访问后得到如下的数据

{
    "count": 2,
    "start": 0,
    "total": 250,
    "subjects": [
        {
            "rating": {
                "max": 10,
                "average": 9.6,
                "stars": "50",
                "min": 0
            },
            "genres": [
                "犯罪",
                "剧情"
            ],
            "title": "肖申克的救赎",
            "casts": [
                {
                    "alt": "https://movie.douban.com/celebrity/1054521/",
                    "avatars": {
                        "small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p17525.webp",
                        "large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p17525.webp",
                        "medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p17525.webp"
                    },
                    "name": "蒂姆·罗宾斯",
                    "id": "1054521"
                },
                {
                    "alt": "https://movie.douban.com/celebrity/1054534/",
                    "avatars": {
                        "small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p34642.webp",
                        "large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p34642.webp",
                        "medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p34642.webp"
                    },
                    "name": "摩根·弗里曼",
                    "id": "1054534"
                },
                {
                    "alt": "https://movie.douban.com/celebrity/1041179/",
                    "avatars": {
                        "small": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p5837.webp",
                        "large": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p5837.webp",
                        "medium": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p5837.webp"
                    },
                    "name": "鲍勃·冈顿",
                    "id": "1041179"
                }
            ],
            "collect_count": 1300722,
            "original_title": "The Shawshank Redemption",
            "subtype": "movie",
            "directors": [
                {
                    "alt": "https://movie.douban.com/celebrity/1047973/",
                    "avatars": {
                        "small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p230.webp",
                        "large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p230.webp",
                        "medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p230.webp"
                    },
                    "name": "弗兰克·德拉邦特",
                    "id": "1047973"
                }
            ],
            "year": "1994",
            "images": {
                "small": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp",
                "large": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp",
                "medium": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp"
            },
            "alt": "https://movie.douban.com/subject/1292052/",
            "id": "1292052"
        },
        {
            "rating": {
                "max": 10,
                "average": 9.5,
                "stars": "50",
                "min": 0
            },
            "genres": [
                "剧情",
                "爱情",
                "同性"
            ],
            "title": "霸王别姬",
            "casts": [
                {
                    "alt": "https://movie.douban.com/celebrity/1003494/",
                    "avatars": {
                        "small": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p67.webp",
                        "large": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p67.webp",
                        "medium": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p67.webp"
                    },
                    "name": "张国荣",
                    "id": "1003494"
                },
                {
                    "alt": "https://movie.douban.com/celebrity/1050265/",
                    "avatars": {
                        "small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1391771959.66.webp",
                        "large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1391771959.66.webp",
                        "medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1391771959.66.webp"
                    },
                    "name": "张丰毅",
                    "id": "1050265"
                },
                {
                    "alt": "https://movie.douban.com/celebrity/1035641/",
                    "avatars": {
                        "small": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1399268395.47.webp",
                        "large": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1399268395.47.webp",
                        "medium": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1399268395.47.webp"
                    },
                    "name": "巩俐",
                    "id": "1035641"
                }
            ],
            "collect_count": 939597,
            "original_title": "霸王别姬",
            "subtype": "movie",
            "directors": [
                {
                    "alt": "https://movie.douban.com/celebrity/1023040/",
                    "avatars": {
                        "small": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1451727734.81.webp",
                        "large": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1451727734.81.webp",
                        "medium": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p1451727734.81.webp"
                    },
                    "name": "陈凯歌",
                    "id": "1023040"
                }
            ],
            "year": "1993",
            "images": {
                "small": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p1910813120.webp",
                "large": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p1910813120.webp",
                "medium": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p1910813120.webp"
            },
            "alt": "https://movie.douban.com/subject/1291546/",
            "id": "1291546"
        }
    ],
    "title": "豆瓣电影Top250"
}

1、安卓原生解析

api自带JSONObject

try {
            JSONObject jsonObject = new JSONObject(jsonStr);//jsonStr为返回的字符串
            int count= jsonObject.getInt("count");//解出count
            int total= jsonObject.getInt("total");//解出total
            String title= jsonObject.getString("title");//解出title
            JSONArray subjects=jsonObject.getJSONArray("subjects");
            for (int i = 0; i <subjects.length() ; i++) {//循环解出数组中的每个对象,这里只解了第一个,后面都是相同的解法
                JSONObject sub=(JSONObject) subjects.get(0);//subjects数组的第一个对象sub
                JSONObject rating=sub.getJSONObject("rating");//sub中的对象rating
                int max=rating.getInt("max");//rating中的max
                JSONArray genres=sub.getJSONArray("genres");//sub中的数组genres
                String genresStr=genres.getString(0);//genres中的第一个值,如果要全解出来加一个for循环取值

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

Google gson包的JsonObject解析

JsonObject obj = (JsonObject) new JsonParser().parse(jsonStr);
        int count = obj.get("count").getAsInt();
        int total = obj.get("total").getAsInt();
        String title = obj.get("title").getAsString();
        JsonArray subjects = obj.getAsJsonArray("subjects");
        for (int i = 0; i < subjects.size(); i++) {//循环解出数组中的每个对象,这里只解了第一个,后面都是相同的解法
            JsonObject sub = (JsonObject) subjects.get(0);//subjects数组的第一个对象sub
            JsonObject rating = sub.getAsJsonObject("rating");//sub中的对象rating
            int max = rating.get("max").getAsInt();//rating中的max
            JsonArray genres = sub.getAsJsonArray("genres");//sub中的数组genres
            String genres1 = genres.get(0).getAsString();//genres中的第一个值,如果要全解出来加一个for循环取值
        }

2、Gson解析

找到这个build文件并打开,加入依赖     compile 'com.google.code.gson:gson:2.7'

这里强烈推荐安装插件GsonFormat (Android Studio安装此插件步骤自行百度)

这个插件是生成实体类的,新建一个类,然后按快捷键alt+s


将请求到的数据粘贴进去,点击OK,这样对应的实体类就生成了,然后直接获取数据

Type type = new TypeToken<TestBean>() {}.getType();//TestBean为实体类名字
        TestBean testBean = new Gson().fromJson(jsonStr, type);//jsonStr为返回的字符串
        int count = testBean.getCount();
        int total = testBean.getTotal();
        for (int i = 0; i < testBean.getSubjects().size(); i++) {
            TestBean.SubjectsBean subject = testBean.getSubjects().get(0);//循环取出后面写.get(i),这里示例取第一个
            int max = subject.getRating().getMax();//取出max的值


            for (int j = 0; j < subject.getGenres().size(); j++) {
                String genre = subject.getGenres().get(0);//循环取出后面写.get(i),这里示例取第一个

            }
        }


猜你喜欢

转载自blog.csdn.net/qq_39761063/article/details/80702321
今日推荐