Json解析

Json解析

首语

  • 本文主要使用三种json解析技术,包括Android原生解析,Gson框架解析,FastJson框架解析。主要以代码举例进行学习。供大家借阅参考,一起进步。

简介

  • JSON的全称是JavaScript Object Notation,是一种轻量级的数据交换格式。

特点

  1. JSON比XML数据传输的有效性要高出很多。

  2. JSON完全独立于编程语言。

  3. 本质就是有特定格式的字符串。

数据格式

  • Json对象{key1:value1,key2:value2,key3:value3}

  • Json数组[value1,value2,value3]

  • 例:[1,"ab",[],{"n":123,"b":"abc"}]

解析方向

  • json<——>javaBean

工具

  • HiJson:Json格式化工具,以树的形式展示,方便json字符查看。
  • GsonFormat插件:快速创建符合的JavaBean。
  • 打开AndroidStudio—>File—>Settings—>Plugins—>搜索框搜索GsonFormat下载。使用时alt+insert快捷键,点击GsonFormat,将json字符串粘贴,就可得到JavaBean。
  • 后面代码的JavaBean都使用GsonFormat自动生成,不再罗列。

安卓原生解析

  • 只提供了将json数据转换为java数据,不提供java转json。

  • 将JSON对象转换为Java对象

json:
{	 
   "id":2,  
   "name":"大虾", 
   "price":12.3, 
   "imagePath":"http://192.168.10.165:8080/L05_Server/images/f1.jpg"
}
//将JSON对象转换为Java对象
private void jsonToObjectByNative () {
    // 1 获取或创建JSON数据
    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";
    //2.解析json
    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();
    }
}
  • 将JSON数组转换为Java集合
json
[
    {
        "id": 1,
        "imagePath": "http://192.168.10.165:8080/L05_Server/images/f1.jpg",
        "name": "大虾1",
        "price": 12.5
    },
    {
        "id": 2,
        "imagePath": "http://192.168.10.165:8080/L05_Server/images/f2.jpg",
        "name": "大虾2",
        "price": 12.3
    }
]
//将JSON数组转换为Java集合
private void jsonToJavaListByNative () {
    List<ShopInfo> list = new ArrayList<>();
    //1.获取或创建JSON数据
    String json = "[\n" +
            "    {\n" +
            "        \"id\": 1,\n" +
            "        \"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" +
            "        \"name\": \"大虾1\",\n" +
            "        \"price\": 12.3\n" +
            "    },\n" +
            "    {\n" +
            "        \"id\": 2,\n" +
            "        \"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" +
            "        \"name\": \"大虾2\",\n" +
            "        \"price\": 12.5\n" +
            "    }\n" +
            "]";
    //2.解析json
    try {
        JSONArray jsonArray = new JSONArray(json);
        for (int i = 0; i < 2; i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            if (jsonObject != null) {
                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);
                list.add(shopInfo);
            }
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
  • 复杂JSON数据解析
json
{
    "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"
}
// 复杂JSON数据解析
private void jsonToJavaOfComplex () {
    //1.获取或创建数据
    String json = "{\n" +
            "    \"data\": {\n" +
            "        \"count\": 5,\n" +
            "        \"items\": [\n" +
            "            {\n" +
            "                \"id\": 45,\n" +
            "                \"title\": \"坚果\"\n" +
            "            },\n" +
            "            {\n" +
            "                \"id\": 132,\n" +
            "                \"title\": \"炒货\"\n" +
            "            },\n" +
            "            {\n" +
            "                \"id\": 166,\n" +
            "                \"title\": \"蜜饯\"\n" +
            "            },\n" +
            "            {\n" +
            "                \"id\": 195,\n" +
            "                \"title\": \"果脯\"\n" +
            "            },\n" +
            "            {\n" +
            "                \"id\": 196,\n" +
            "                \"title\": \"礼盒\"\n" +
            "            }\n" +
            "        ]\n" +
            "    },\n" +
            "    \"rs_code\": \"1000\",\n" +
            "    \"rs_msg\": \"success\"\n" +
            "}";
    //2.解析json
    DataInfo dataInfo = new DataInfo();
    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");

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

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

        //第二层封装
        dataBean.setCount(count);
        List<DataInfo.DataBean.ItemsBean> itemsBean = new ArrayList<>();
        dataBean.setItems(itemsBean);

        //第三层解析
        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");
                //第三层数据封装
                DataInfo.DataBean.ItemsBean bean = new DataInfo.DataBean.ItemsBean();
                bean.setId(id);
                bean.setTitle(title);
                itemsBean.add(bean);
            }
        }


    } catch (JSONException e) {
        e.printStackTrace();
    }
}
  • 特殊JSON数据解析
json
{
    "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"
        }
    }
}
//特殊JSON数据解析
private void jsonToJavaOfSpecial () {
    //1.获取或创建数据
    String json = "{\n" +
            "    \"code\": 0,\n" +
            "    \"list\": {\n" +
            "        \"0\": {\n" +
            "            \"aid\": \"6008965\",\n" +
            "            \"author\": \"哔哩哔哩番剧\",\n" +
            "            \"coins\": 170,\n" +
            "            \"copyright\": \"Copy\",\n" +
            "            \"create\": \"2016-08-25 21:34\"\n" +
            "        },\n" +
            "        \"1\": {\n" +
            "            \"aid\": \"6008938\",\n" +
            "            \"author\": \"哔哩哔哩番剧\",\n" +
            "            \"coins\": 404,\n" +
            "            \"copyright\": \"Copy\",\n" +
            "            \"create\": \"2016-08-25 21:33\"\n" +
            "        }\n" +
            "    }\n" +
            "}";
    //2.解析json
    FilmInfo filmInfo = new FilmInfo();
    try {
        JSONObject jsonObject = new JSONObject(json);
        //第一层解析
        int code = jsonObject.optInt("code");
        JSONObject list = jsonObject.optJSONObject("list");

        //第一层封装
        filmInfo.setCode(code);
        List<FilmInfo.FilmBean> lists = new ArrayList<>();
        filmInfo.setList(lists);
        //第二层解析
        for (int i = 0; i < list.length(); i++) {
            JSONObject jsonObject1 = list.optJSONObject(i + "");
            if (jsonObject1 != null) {
                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");

                //第二层数据封装
                FilmInfo.FilmBean filmBean = new FilmInfo.FilmBean();
                filmBean.setAid(aid);
                filmBean.setAuthor(author);
                filmBean.setCoins(coins);
                filmBean.setCopyright(copyright);
                filmBean.setCreate(create);
                lists.add(filmBean);
            }

        }

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

Gson解析

  • Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。
特性
  1. 快速、高效。
  2. 代码量少、简洁。
  3. 面向对象。
  4. 数据传递和解析方便。
GitHub地址:https://github.com/google/gson
依赖:implementation 'com.google.code.gson:gson:2.8.5'
  • 将json格式的字符串{}转换为Java对象
// 将json格式的字符串{}转换为Java对象
private void jsonToJavaObjectByGson () {
    //创建数据
    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";
    //解析json数据
    Gson gson = new Gson();
    ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);
}
  • 将json格式的字符串数组转换为Java对象的List
//将json格式的字符串[]转换为Java对象的List
private void jsonToJavaListByGson () {
    // 1 获取或创建JSON数据
    String json = "[\n" +
            "    {\n" +
            "        \"id\": 1,\n" +
            "        \"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" +
            "        \"name\": \"大虾1\",\n" +
            "        \"price\": 12.3\n" +
            "    },\n" +
            "    {\n" +
            "        \"id\": 2,\n" +
            "        \"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" +
            "        \"name\": \"大虾2\",\n" +
            "        \"price\": 12.5\n" +
            "    }\n" +
            "]";
    //2.解析json
    Gson gson = new Gson();
    List<ShopInfo> shops = gson.fromJson(json, new TypeToken<List<ShopInfo>>() {
    }.getType());
}
  • 将Java对象转换为json字符串对象
//将Java对象转换为json字符串{}
private void javaToJsonObjectByGson () {
    //1.创建java对象
    ShopInfo shopInfo = new ShopInfo(1, "鲍鱼", 250, "baoyuwang.com.cn");
    //2.生成json数据
    Gson gson = new Gson();
    String json = gson.toJson(shopInfo);
}
  • 将java对象的List转换为json字符串数组
//将Java对象的List转换为json字符串[]
private void javaToJsonArrayByGson () {
    //1.创建java对象
    List<ShopInfo> shops = new ArrayList<>();
    ShopInfo baoyu = new ShopInfo(1, "鲍鱼", 250, "baoyuwang.com.cn");
    ShopInfo longxia = new ShopInfo(1, "龙虾", 200, "longxiawang.com.cn");
    shops.add(baoyu);
    shops.add(longxia);
    //2.生成jsonshuj
    Gson gson = new Gson();
    String json = gson.toJson(shops);
}

FastJson解析

  • java语言编写的高性能完善的json库,采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,目前java语言中最快的JSON库。
特性
  • 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)
  • 强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
  • 零依赖(没有依赖其它任何类库除了JDK)
GitHub地址:https://github.com/alibaba/fastjson
依赖:implementation 'com.alibaba:fastjson:1.2.59'
  • 将json格式的字符串对象转换为Java对象
//将json格式的字符串{}转换为Java对象
private void jsonToJavaObjectByFastJson () {
    //1.创建json数据
    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";
    //2.json解析
    ShopInfo shopInfo = JSON.parseObject(json, ShopInfo.class);
}
  • 将json格式的字符串数组转换为Java对象的List
//将json格式的字符串[]转换为Java对象的List
private void jsonToJavaListByFastJson () {
    //1.创建json数据
    String json = "[\n" +
            "    {\n" +
            "        \"id\": 1,\n" +
            "        \"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" +
            "        \"name\": \"大虾1\",\n" +
            "        \"price\": 12.3\n" +
            "    },\n" +
            "    {\n" +
            "        \"id\": 2,\n" +
            "        \"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" +
            "        \"name\": \"大虾2\",\n" +
            "        \"price\": 12.5\n" +
            "    }\n" +
            "]";
    //2.json解析
    List<ShopInfo> shopInfos = JSON.parseArray(json, ShopInfo.class);
}
  • 将Java对象转换为json字符串对象
//将Java对象转换为json字符串{}
private void javaToJsonObjectByFastJson () {
    //1.创建java对象
    ShopInfo shopInfo = new ShopInfo(1, "小成", 10000, "xiaochengwang.com.cn");
    //2.生成json数据
    String json = JSON.toJSONString(shopInfo);
}
  • 将Java对象的List转换为json字符串数组
//将Java对象的List转换为json字符串[]
private void javaToJsonArrayByFastJson () {
    //1.创建java对象
    List<ShopInfo> list = new ArrayList<>();
    ShopInfo xiaoli = new ShopInfo(1, "xiaoli", 220, "xiaoliwang.com.cn");
    ShopInfo xiaoying = new ShopInfo(2, "xiaoying", 120, "xiaoyingwang.com.cn");
    list.add(xiaoli);
    list.add(xiaoying);
    //2.生成json数据
    String json = JSON.toJSONString(list);
  } 

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.yanghujun.com/archives/json解析

Buy me a cup of coffee ☕.