三、解析Json数据

一、Android原生技术解析Json数据

1.1 将json格式的字符串{}转换为Java对象

1.1.1 API

JSONObject(String json) : 将json字符串解析为json对象
Xxx getXxx(String name) : 根据name, 在json对象中得到对应的Value
Xxx optXxx(String name) : 根据name, 在json对象中得到对应的Value

注意:optXxx方法会在对应的key中的值不存在的时候返回一个空字符串或者返回你指定的默认值,但是getString()方法当key中的值不存在时会出现空指针异常的错误。

1.1.2 测试数据

{
    "id":2, 
    "name":"大虾", 
    "price":12.3, 
    "imagePath":"http://192.168.10.165:8080/L05_Server/images/f1.jpg"
}

1.1.3 代码实现

 //解析数据
        try {
            JSONObject jsonObject = new JSONObject(json);
            int id = jsonObject.optInt("id");
            String name = jsonObject.optString("name");
            double price = jsonObject.optDouble("price");
            String imagePath = jsonObject.optString("imagePath");

            shopInfo = new ShopInfo(id, name, price, imagePath);

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

1.2 将json格式的字符串[]转换为Java对象的List

1.2.1 API

JSONArray(String json) : 将json字符串解析为json数组
int length() : 得到json数组中元素的个数
Xxx getXxx(int index) : 根据下标得到json数组中对应的元素数据
Xxx optXxx(int index) : 根据下标得到json数组中对应的元素数据

注意:optXxx方法会在对应的key中的值不存在的时候返回一个空字符串或者返回你指定的默认值,但是getString()方法当key中的值不存在时会出现空指针异常的错误。

1.2.2 测试数据

[
    {
        "id": 1,
        "imagePath": "http://192.168.10.165:8080/f1.jpg",
        "name": "大虾1",
        "price": 12.3
    },
    {
        "id": 2,
        "imagePath": "http://192.168.10.165:8080/f2.jpg",
        "name": "大虾2",
        "price": 12.5
    }
]

1.2.3 代码实现

 //解析Json数据
        ArrayList<ShopInfo> shopInfos = new ArrayList<>();
        try {
            JSONArray jsonArray = new JSONArray(json);
            
            for (int i = 0;i<jsonArray.length();i++){
                JSONObject jsonObject = jsonArray.getJSONObject(i);

                int id = jsonObject.optInt("id");
                String name = jsonObject.optString("name");
                double price = jsonObject.optDouble("price");
                String imagePath = jsonObject.optString("imagePath");

                ShopInfo shopInfo = new ShopInfo(id, name, price, imagePath);

                shopInfos.add(shopInfo);

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

1.3 复杂json数据解析

1.3.1 测试数据

{
    "data": {
        "count": 5,
        "items": [
            {
                "id": 45,
                "title": "坚果"
            },
            {
                "id": 132,
                "title": "炒货"
            },
            {
                "id": 166,
                "title": "蜜饯"
            },
            {
                "id": 195,
                "title": "果脯"
            },
            {
                "id": 196,
                "title": "礼盒"
            }
        ]
    },
    "rs_code": "1000",
    "rs_msg": "success"
}

1.3.2 使用HiJson工具格式化json数据

[HiJson](链接:https://pan.baidu.com/s/1QqKypwfvnn9eebSHLSXdQQ
提取码:hfm2 )

HiJson.png

1.3.3 使用GsonFormat插件在AndroidStudio中生成对应的bean

1.3.4 代码实现

先逐层解析,然后逐层封装

//解析数据,
        try {
            //第一层解析
            JSONObject jsonObject = new JSONObject(json);
            JSONObject data = jsonObject.optJSONObject("data");
            String rs_code = jsonObject.optString("rs_code");
            String rs_msg = jsonObject.optString("rs_msg");

            //第一层封装
            dateInfo = new DateInfo();
            DateInfo.DataBean dataBean = new DateInfo.DataBean();
            dateInfo.setData(dataBean);
            dateInfo.setRs_code(rs_code);
            dateInfo.setRs_msg(rs_msg);


            //第二层解析
            int count = data.optInt("count");
            JSONArray items = data.optJSONArray("items");

            //第二层封装

            dataBean.setCount(count);

            List<DateInfo.DataBean.ItemsBean> itemBean = new ArrayList<>();
            dataBean.setItems(itemBean);

            //第三层解析
            for (int i = 0; i <items.length() ; i++) {
                JSONObject jsonObject1 = items.optJSONObject(i);
                if (jsonObject1 != null){
                    int id = jsonObject1.optInt("id");
                    String title = jsonObject1.optString("title");

                    //第三层封装
                    DateInfo.DataBean.ItemsBean itemsBean = new DateInfo.DataBean.ItemsBean();
                    itemsBean.setId(id);
                    itemsBean.setTitle(title);
                    itemBean.add(itemsBean);
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

1.4 特殊json数据解析

1.4.1 测试数据

特殊在键名是0和1,不能通过GsonFormat自动生成bean类,只能手动写

{
    "code": 0,
    "list": {
        "0": {
            "aid": "6008965",
            "author": "哔哩哔哩番剧",
            "coins": 170,
            "copyright": "Copy",
            "create": "2016-08-25 21:34"
        },
        "1": {
            "aid": "6008938",
            "author": "哔哩哔哩番剧",
            "coins": 404,
            "copyright": "Copy",
            "create": "2016-08-25 21:33"
        }
    }
}

1.4.2 手动写bean类

public  class FileBean {
    private int code;
    private List<FilmBean> filmBeans;

    @Override
    public String toString() {
        return "FileBean{" +
                "code=" + code +
                ", filmBeans=" + filmBeans +
                '}';
    }

    public int getCode() {
        return code;
    }

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

    public List<FilmBean> getFilmBeans() {
        return filmBeans;
    }

    public void setFilmBeans(List<FilmBean> filmBeans) {
        this.filmBeans = filmBeans;
    }

    public static class FilmBean {
        private String aid;
        private String author;
        private int coins;
        private String copyright;
        private String create;

        @Override
        public String toString() {
            return "FileBean{" +
                    "aid='" + aid + '\'' +
                    ", author='" + author + '\'' +
                    ", coins=" + coins +
                    ", copyright='" + copyright + '\'' +
                    ", create='" + create + '\'' +
                    '}';
        }

        public String getAid() {
            return aid;
        }

        public void setAid(String aid) {
            this.aid = aid;
        }

        public String getAuthor() {
            return author;
        }

        public void setAuthor(String author) {
            this.author = author;
        }

        public int getCoins() {
            return coins;
        }

        public void setCoins(int coins) {
            this.coins = coins;
        }

        public String getCopyright() {
            return copyright;
        }

        public void setCopyright(String copyright) {
            this.copyright = copyright;
        }

        public String getCreate() {
            return create;
        }

        public void setCreate(String create) {
            this.create = create;
        }
    }
}

1.4.3 手动解析Json数据

//解析数据
        try {
            //第一层解析
            JSONObject jsonObject = new JSONObject(json);
            int code = jsonObject.optInt("code");
            JSONObject list = jsonObject.optJSONObject("list");

            //第一层封装
            fileBean = new FileBean();
            fileBean.setCode(code);
            ArrayList<FileBean.FilmBean> fileBeans = new ArrayList<>();
            fileBean.setFilmBeans(fileBeans);

            //第二层解析
            for (int i = 0; i < list.length(); i++) {
                JSONObject jsonObject1 = list.optJSONObject(i + "");
                String aid = jsonObject1.optString("aid");
                String author = jsonObject1.optString("author");
                int coins = jsonObject1.optInt("coins");
                String copyright = jsonObject1.optString("copyright");
                String create = jsonObject1.optString("create");

                //第二层封装
                FileBean.FilmBean filmBean = new FileBean.FilmBean();
                filmBean.setAid(aid);
                filmBean.setAuthor(author);
                filmBean.setCoins(coins);
                filmBean.setCopyright(copyright);
                filmBean.setCreate(create);

                fileBeans.add(filmBean);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

二、Gson框架技术

下载Gson框架,下载地址
[Jar包](链接:https://pan.baidu.com/s/1hq00k7ZXm2Rypfof5_dhYA
提取码:yisw )
将Gson的jar包导入到项目中即可使用Gson

2.1 将json格式的字符串{}转换为Java对象

2.1.1 API

fromJson(String json, Class<T> classOfT);
第一个参数为json数据,第二个参数为对应的bean类。
注意:要求json对象中的key的名称与java对象对应的类中的属性名要相同。

2.1.2 测试数据

{
    "id":2, "name":"大虾", 
    "price":12.3, 
    "imagePath":"http://192.168.10.165:8080/L05_Server/images/f1.jpg"
}

2.1.3 代码实现

//解析数据
        Gson gson = new Gson();
        ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);

2.2 将json格式的字符串[]转换为Java对象的List

2.2.1 API

List<ShopInfo> shops = gson.fromJson(json, new TypeToken<List<ShopInfo>>() {}.getType());

2.2.2 测试数据

[
    {
        "id": 1,
        "imagePath": "http://192.168.10.165:8080/f1.jpg",
        "name": "大虾1",
        "price": 12.3
    },
    {
        "id": 2,
        "imagePath": "http://192.168.10.165:8080/f2.jpg",
        "name": "大虾2",
        "price": 12.5
    }
]

2.2.3 代码实现

Gson gson = new Gson();
List<ShopInfo> shopInfos= gson.fromJson(json, 
new TypeToken<List<ShopInfo>>() { }.getType());

2.3 将Java对象转换为json字符串{}

2.3.1 API

String toJson(Object src);

2.3.2 代码示例

/**
 * 将Java对象转换为json字符串
*/
    private void JavaToJsonObjectByGson() {
        ShopInfo shopInfo = new ShopInfo(3, "螃蟹", 250.0, "pangxie");

        Gson gson = new Gson();
        String json = gson.toJson(shopInfo);

        tvOriginal.setText(shopInfo.toString());
        tvLast.setText(json);
    }

2.4 将Java对象的List转换为json字符串[]

2.4.1 API

String toJson(Object src);

2.4.2 代码示例

/**
 * Java对象的List转换为json
 */
    private void JavaListToJsonByGson() {
        ArrayList<ShopInfo> shops = new ArrayList<>();
        ShopInfo haidai = new ShopInfo(4, "海带", 13.3, "haidai");
        ShopInfo haima = new ShopInfo(5, "海马", 14.3, "haima");
        shops.add(haidai);
        shops.add(haima);
        String json = new Gson().toJson(shops);
        tvOriginal.setText(shops.toString());
        tvLast.setText(json);
    }

三、FastJson框架技术

下载FastJson,下载地址
[jar包](链接:https://pan.baidu.com/s/16g28Dd0TuOZWgDauRh7hWg
提取码:2pu1 )

3.1 将json格式的字符串{}转换为Java对象

3.1.1 API

注意:对应的bean类必须有默认的构造方法
parseObject(String json, Class<T> classOfT);

3.1.2 测试数据

{
    "id":2, "name":"大虾", 
    "price":12.3, 
    "imagePath":"http://192.168.10.165:8080/L05_Server/images/f1.jpg"
}

3.1.3 代码示例

 /**
     * 将json转换为java对象
     */
    private void JsonToJavaObjectByFastJson() {
        String json = "{\n" +
                "\t\"id\":2, \"name\":\"大虾\", \n" +
                "\t\"price\":12.3, \n" +
                "\t\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"\n" +
                "}\n";

        ShopInfo shopInfo = JSON.parseObject(json, ShopInfo.class);

        tvOriginal.setText(json);
        tvLast.setText(shopInfo.toString());
    }

3.2 将json格式的字符串[]转换为Java对象的List

3.2.1 API

List<T> parseArray(String json,Class<T> classOfT);

3.2.2 测试数据

[
    {
        "id": 1,
        "imagePath": "http://192.168.10.165:8080/f1.jpg",
        "name": "大虾1",
        "price": 12.3
    },
    {
        "id": 2,
        "imagePath": "http://192.168.10.165:8080/f2.jpg",
        "name": "大虾2",
        "price": 12.5
    }
]

3.2.3 代码示例

 List<ShopInfo> shopInfos = JSON.parseArray(json, ShopInfo.class);

3.3 将Java对象转换为Json字符串

3.3.1 API

String toJSONString(Object object);

3.3.2 代码示例

/**
     * java对象转换为json字符串
     */
    private void JavaObjectToJson() {
        ShopInfo shopInfo = new ShopInfo(7, "鱼", 1.3, "yu");

        String json = JSON.toJSONString(shopInfo);

        tvOriginal.setText(shopInfo.toString());
        tvLast.setText(json);
    }

3.4 将Java数组转换为Json字符串

3.4.1 API

String toJSONString(ArrayList<> lists);

3.4.2 代码演示

/**
     * java数组转换为json字符串
     */
    private void JavaListToJson() {
        ShopInfo pingguo = new ShopInfo(6, "苹果", 5.0, "pingguo");
        ShopInfo xeuli = new ShopInfo(7, "雪梨", 2.5, "xeuli");

        ArrayList<ShopInfo> shops = new ArrayList<>();

        shops.add(pingguo);
        shops.add(xeuli);

        String json = JSON.toJSONString(shops);

        tvOriginal.setText(shops.toString());
        tvLast.setText(json);
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容