Gson数据解析

转帖请注明本文出自weimeig的博客(https://blog.csdn.net/weimeig/article/details/80251365),请尊重他人的辛勤劳动成果,谢谢


添加依赖 

build.gradle

dependencies {
    compile 'com.google.code.gson:gson:2.4'
}

右上角Sync Now


AndroidStudio自带了将Json数据自动生成实体类的工具,详情可百度,这里不详述

初步入门案例1:

定义模拟的需要解析的数据

  String cniao = "{\n" +
                    "\"sites\": [\n" +
                    "{ \"name\":\"菜鸟教程\" , \"url\":\"m.runoob.com\" }, \n" +
                    "{ \"name\":\"google\" , \"url\":\"www.google.com\" }, \n" +
                    "{ \"name\":\"微博\" , \"url\":\"www.weibo.com\" }\n" +
                    "]\n" +
                    "}";

定义存放被解析的数据的实体类对象

cainiao.java

/**
     * 存放被解析的数据的实体类对象
     * cainiao.java
     */
    public static class cainiao{
        private List<SitesBean> sites;

        public List<SitesBean> getSites() {
            return sites;
        }

        public void setSites(List<SitesBean> sites) {
            this.sites = sites;
        }

        public static class SitesBean {

            private String name;
            private String url;

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getUrl() {
                return url;
            }

            public void setUrl(String url) {
                this.url = url;
            }
        }
    }

数据解析

            //参数1:网络请求所返还的需要解析的数据对象,参数2:要把数据解析到的实体类对象
            cainiao st= new Gson().fromJson(cniao,cainiao.class);


强化练习案例2:

定义模拟的需要解析的数据
String login = "{\n" +
                "    \"code\": \"200\",\n" +
                "    \"info\": \"登录成功\",\n" +
                "    \"data\": {\n" +
                "        \"userId\": \"10000\",\n" +
                "        \"userName\": \"刘德华\",\n" +
                "        \"userDeteilInfo\": {\n" +
                "            \"sex\": \"男\"\n" +
                "        }\n" +
                "    }\n" +
                "}\n";

定义存放被解析的数据的实体类对象

public static class Login{
        private String code;
        private String info;
        private DataBean data;

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public String getInfo() {
            return info;
        }

        public void setInfo(String info) {
            this.info = info;
        }

        public DataBean getData() {
            return data;
        }

        public void setData(DataBean data) {
            this.data = data;
        }

        public static class DataBean {

            private String userId;
            private String userName;
            private UserDeteilInfoBean userDeteilInfo;

            public String getUserId() {
                return userId;
            }

            public void setUserId(String userId) {
                this.userId = userId;
            }

            public String getUserName() {
                return userName;
            }

            public void setUserName(String userName) {
                this.userName = userName;
            }

            public UserDeteilInfoBean getUserDeteilInfo() {
                return userDeteilInfo;
            }

            public void setUserDeteilInfo(UserDeteilInfoBean userDeteilInfo) {
                this.userDeteilInfo = userDeteilInfo;
            }

            public static class UserDeteilInfoBean {

                private String sex;

                public String getSex() {
                    return sex;
                }

                public void setSex(String sex) {
                    this.sex = sex;
                }
            }
        }
    }

数据解析

        Login loginTest = new Gson().fromJson(login,Login.class);
        System.out.print(loginTest.getData().getUserName());

对象中包含集合数据的获取方法:

当数据包含状态码,数据体等信息时,复制数据到实体类中使用AndroidStudio生成实体类为下类代码时,

/**
     * 数据实体类
     */
    public static class music{
        private AudioinfosBean audioinfos;

        public AudioinfosBean getAudioinfos() {
            return audioinfos;
        }

        public void setAudioinfos(AudioinfosBean audioinfos) {
            this.audioinfos = audioinfos;
        }

        public static class AudioinfosBean {
            private List<CatsBean> cats;

            public List<CatsBean> getCats() {
                return cats;
            }

            public void setCats(List<CatsBean> cats) {
                this.cats = cats;
            }

            public static class CatsBean {
                /**
                 * cat_count : 3
                 * cat_icon_url : http://img.idaddy.cn/f/h/4/xs4ozwyc.jpg
                 * cat_name : 热门儿歌
                 * cat_id : 8118
                 * cat_group_age_scope : -1-6
                 * cat_parent : 6707
                 */

                private String cat_count;
                private String cat_icon_url;
                private String cat_name;
                private int cat_id;
                private String cat_group_age_scope;
                private int cat_parent;

                public String getCat_count() {
                    return cat_count;
                }

                public void setCat_count(String cat_count) {
                    this.cat_count = cat_count;
                }

                public String getCat_icon_url() {
                    return cat_icon_url;
                }

                public void setCat_icon_url(String cat_icon_url) {
                    this.cat_icon_url = cat_icon_url;
                }

                public String getCat_name() {
                    return cat_name;
                }

                public void setCat_name(String cat_name) {
                    this.cat_name = cat_name;
                }

                public int getCat_id() {
                    return cat_id;
                }

                public void setCat_id(int cat_id) {
                    this.cat_id = cat_id;
                }

                public String getCat_group_age_scope() {
                    return cat_group_age_scope;
                }

                public void setCat_group_age_scope(String cat_group_age_scope) {
                    this.cat_group_age_scope = cat_group_age_scope;
                }

                public int getCat_parent() {
                    return cat_parent;
                }

                public void setCat_parent(int cat_parent) {
                    this.cat_parent = cat_parent;
                }
            }
        }
    }

使用类名.方法名,直到找到包含该数据的代码块,取出数据并存到list集合中,遍历输出观察效果

        music sc = new Gson().fromJson(msc,music.class);
        List<music.AudioinfosBean.CatsBean> list =sc.getAudioinfos().getCats();
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).cat_name);
        }

定义模拟的需要解析的数据源

 String msc = "{\n" +
                    "    \"audioinfos\": {\n" +
                    "        \"cats\": [\n" +
                    "            {\n" +
                    "                \"cat_count\": \"3\",\n" +
                    "                \"cat_icon_url\": \"http://img.idaddy.cn/f/h/4/xs4ozwyc.jpg \n" +
                    "\n" +
                    "\",\n" +
                    "                \"cat_name\": \"热门儿歌\",\n" +
                    "                \"cat_id\": 8118,\n" +
                    "                \"cat_group_age_scope\": \"-1-6\",\n" +
                    "                \"cat_parent\": 6707\n" +
                    "            },\n" +
                    "            {\n" +
                    "                \"cat_count\": \"0\",\n" +
                    "                \"cat_icon_url\": \"http://img.idaddy.cn/f/h/4/nl9ezckp.jpg \n" +
                    "\n" +
                    "\",\n" +
                    "                \"cat_name\": \"早教儿歌\",\n" +
                    "                \"cat_id\": 10719,\n" +
                    "                \"cat_group_age_scope\": \"1-6\",\n" +
                    "                \"cat_parent\": 6707\n" +
                    "            },\n" +
                    "            {\n" +
                    "                \"cat_count\": \"1\",\n" +
                    "                \"cat_icon_url\": \"http://img.idaddy.cn/f/h/4/dsws0q0o.jpg \n" +
                    "\n" +
                    "\",\n" +
                    "                \"cat_name\": \"幼儿园童谣\",\n" +
                    "                \"cat_id\": 11423,\n" +
                    "                \"cat_group_age_scope\": \"1-6\",\n" +
                    "                \"cat_parent\": 6707\n" +
                    "            },\n" +
                    "            {\n" +
                    "                \"cat_count\": \"1\",\n" +
                    "                \"cat_icon_url\": \"http://img.idaddy.cn/f/h/6/f5i1z0n9.jpg \n" +
                    "\n" +
                    "\",\n" +
                    "                \"cat_name\": \"韵律童谣\",\n" +
                    "                \"cat_id\": 13945,\n" +
                    "                \"cat_group_age_scope\": \"2-6\",\n" +
                    "                \"cat_parent\": 6707\n" +
                    "            },\n" +
                    "            {\n" +
                    "                \"cat_count\": \"0\",\n" +
                    "                \"cat_icon_url\": \"http://img.idaddy.cn/f/h/4/k5xrsszd.jpg \n" +
                    "\n" +
                    "\",\n" +
                    "                \"cat_name\": \"幼小衔接\",\n" +
                    "                \"cat_id\": 14655,\n" +
                    "                \"cat_group_age_scope\": \"2-6\",\n" +
                    "                \"cat_parent\": 6707\n" +
                    "            }\n" +
                    "        ]\n" +
                    "    }\n" +
                    "}\n";


含有集合对象的数据解析:

当Json数据中含有[]中括号时,说明该括号内的数据为集合数据,因此需要使用集合数据的数据解析方法进行解析

练习1:

服务器返回的Json数据为:

[
   "111",
    "222",
"333"
]

看到中括号,说明是一段集合数据

定义模拟的需要解析的数据

        String test = "[\n" +
                "   \"111\",\n" +
                "    \"222\",\n" +
                "\"333\"\n" +
                "]";

这段数据不是键值对,直接定义一个String类型接收即可

Type type = new TypeToken<List<String>>(){}.getType();//这里的泛型将会决定你的json字符串转化的类型,一般是传实体类的对象
        //参数1:满足json数组形式的字符串
        //参数2:Type对象
        List<String> list = new Gson().fromJson(test,type);
        System.out.println(list.get(2));

------------------------------------------------------------------

那么问题来了,如果返回的数据是键值对类型的集合数据呢?

比如

[
    {
        "name": "宝宝乐",
        "cast": "98"
    },
    {
        "name": "宝宝乐1",
        "cast": "1289"
    },
    {
        "name": "宝宝乐2",
        "cast": "154"
    }
]

定义模拟的需要解析的数据

String shop = "[\n" +
                "    {\n" +
                "        \"name\": \"宝宝乐\",\n" +
                "        \"cast\": \"98\"\n" +
                "    },\n" +
                "    {\n" +
                "        \"name\": \"宝宝乐1\",\n" +
                "        \"cast\": \"1289\"\n" +
                "    },\n" +
                "    {\n" +
                "        \"name\": \"宝宝乐2\",\n" +
                "        \"cast\": \"154\"\n" +
                "    }\n" +
                "]";

定义存放被解析的数据的实体类对象

 /**
     * 被解析的数据的实体类对象
     */
    public static class BabyShop{
        private String name;
        private String cast;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getCast() {
            return cast;
        }

        public void setCast(String cast) {
            this.cast = cast;
        }
    }

数据解析

        Type type = new TypeToken<List<BabyShop>>(){}.getType();//这里的泛型将会决定你的json字符串转化的类型,一般是传实体类的对象
            //参数1:满足json数组形式的字符串
            //参数2:Type对象
        List<BabyShop> list= new Gson().fromJson(shop,type);

练习2:

定义模拟的需要解析的数据

            String integralss = "{ \"userIntegralss\":\"8000\"," +
                    "\"List\":[ {\"integralss\":\"50\"," +
                    "\"name\":\"zhangqi\"},{\"integralss" +
                    "\":\"60\",\"name\":\"lisi\"}]}";
定义存放被解析的数据的实体类对象

Integrals.class

public static class Integrals{
        private String userIntegralss;
        private java.util.List<ListBean> List;

        public String getUserIntegralss() {
            return userIntegralss;
        }

        public void setUserIntegralss(String userIntegralss) {
            this.userIntegralss = userIntegralss;
        }

        public List<ListBean> getList() {
            return List;
        }

        public void setList(List<ListBean> List) {
            this.List = List;
        }

        public static class ListBean {

            private String integralss;
            private String name;

            public String getIntegralss() {
                return integralss;
            }

            public void setIntegralss(String integralss) {
                this.integralss = integralss;
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }
        }
    }

数据解析

        Integrals jfw = new Gson().fromJson(integralss,Integrals.class);
        List<Integrals.ListBean> list =jfw.getList();
        System.out.println(list.get(0).getIntegralss());

--------------------------------------------------------------------

将数据转换为Json数据格式

上面讲述了,服务器的Json数据如何解析到本地实体类,那么本地实体类的数据,又要怎么解析成Json数据呢?

定义存放本地数据的实体类

public class Info{

        private int code;
        private String info;
        private int data;

        public int getData() {
            return data;
        }

        public void setData(int data) {
            this.data = data;
        }

        public String getInfo() {
            return info;
        }

        public void setInfo(String info) {
            this.info = info;
        }

        public int getCode() {
            return code;
        }

        public void setCode(int code) {
            this.code = code;
        }
    }

定义模拟用户操作数据后,并将数据解析为Json数据的解析方法

    public String login(){
        Info info = new Info();
        info.setCode(200);
        info.setData(10000);
        info.setInfo("注册失败");
        String result = new Gson().toJson(info);
        return result;
    }

调用该解析方法,并将其赋值给result对象保存

String result = login();
那么这个result对象,便是被解析为Json数据的对象了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值