json的解析

Posted 劲火星空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了json的解析相关的知识,希望对你有一定的参考价值。

一、概念



什么是json

简单地说,JSON 可以将 javascript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比"名称 / 值对"更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。

二、特点

(1)表示名称键值对
这个比较简单,表示的形式如下:
按照最简单的形式,可以用下面这样的 JSON 表示 "名称 / 值对" : "firstName": "Brett"

(2)表示数组
如果使用 JSON,就只需将多个带花括号的记录分组在一起:

     "people": [

     "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" ,

     "firstName": "Jason", "lastName":"Hunter", "email": "bbbb",

     "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" 

    ]


三、原生解析

1.原生解析

(1)将json格式的字符串解析为对象

    private void jsonToJavaObjectByNative() 

        // 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";

        ShopInfo shopInfo = null;

        // 2 解析json
        try 
            JSONObject jsonObject = new JSONObject(json);
//            int id = jsonObject.getInt("id");
            int id1 = jsonObject.optInt("id");

            String name = jsonObject.optString("name");

            double price = jsonObject.optDouble("price");

            String imagePath = jsonObject.optString("imagePath");

            // 封装Java对象
            shopInfo = new ShopInfo(id1, name, price, imagePath);

         catch (JSONException e) 
            e.printStackTrace();
        

        // 3 显示JSON数据
        tv_native_orignal.setText(json);
        tv_native_last.setText(shopInfo.toString());
    

(2)将json字符串转换成对象的List

    private void jsonToJavaObjectByNative() 

        // 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";

        ShopInfo shopInfo = null;

        // 2 解析json
        try 
            JSONObject jsonObject = new JSONObject(json);
//            int id = jsonObject.getInt("id");
            int id1 = jsonObject.optInt("id");

            String name = jsonObject.optString("name");

            double price = jsonObject.optDouble("price");

            String imagePath = jsonObject.optString("imagePath");

            // 封装Java对象
            shopInfo = new ShopInfo(id1, name, price, imagePath);

         catch (JSONException e) 
            e.printStackTrace();
        

        // 3 显示JSON数据
        tv_native_orignal.setText(json);
        tv_native_last.setText(shopInfo.toString());
    

(3)嵌套的json的解析

对于这样形式的json对象字符串,需要进行一层一层的解析

    private void jsonToJavaOfComplex() 

        // 1 获取或创建JSON数据
        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" +
                "";

        // 封装Java对象
        DataInfo dataInfo = new DataInfo();

        // 2 解析json
        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();
        

        // 3 显示JSON数据
        tv_native_orignal.setText(json);
        tv_native_last.setText(dataInfo.toString());
    



四、Gson解析



可以看出来通过原生的方式来进行解析还是比较困难的

(1)将json格式的字符串解析为对象

    private void jsonToJavaObjectByGson() 

        // 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数据
        Gson gson = new Gson();

        ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);

        // 3 展示数据
        tv_gson_orignal.setText(json);
        tv_gson_last.setText(shopInfo.toString());

    
如下是ShopInfo对象

public class ShopInfo 
    private int id;
    private String name;
    private double price;
    private String imagePath;

    public ShopInfo(int id, String name, double price, String imagePath) 
        this.id = id;
        this.name = name;
        this.price = price;
        this.imagePath = imagePath;
    

    public ShopInfo() 
    

    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    public String getName() 
        return name;
    

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

    public double getPrice() 
        return price;
    

    public void setPrice(double price) 
        this.price = price;
    

    public String getImagePath() 
        return imagePath;
    

    public void setImagePath(String imagePath) 
        this.imagePath = imagePath;
    

    @Override
    public String toString() 
        return "ShopInfo" +
                "id=" + id +
                ", name='" + name + '\\'' +
                ", price=" + price +
                ", imagePath='" + imagePath + '\\'' +
                '';
    

(2)将json字符串解析成对象的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());

        // 3 展示数据
        tv_gson_orignal.setText(json);
        tv_gson_last.setText(shops.toString());
    

(3)将java对象转换成json字符串

    private void javaToJsonObjectByGson() 

        // 1 获取或创建Java对象
        ShopInfo shopInfo = new ShopInfo(1,"鲍鱼",250.0,"baoyu");

        // 2 生成JSON数据
        Gson gson = new Gson();

        String json = gson.toJson(shopInfo);

        // 3 展示数据
        tv_gson_orignal.setText(shopInfo.toString());
        tv_gson_last.setText(json);
    

(4)将java对象List转换成json字符串

好的的方法都已经封装好了,使用起来还是挺给力的

    private void javaToJsonArrayByGson() 

        // 1 获取或创建Java对象
        List<ShopInfo> shops = new ArrayList<>();
        ShopInfo baoyu = new ShopInfo(1, "鲍鱼", 250.0, "baoyu");
        ShopInfo longxia = new ShopInfo(2, "龙虾", 251.0, "longxia");

        shops.add(baoyu);
        shops.add(longxia);

        // 2 生成JSON数据
        Gson gson = new Gson();
        String json = gson.toJson(shops);

        // 3 展示数据
        tv_gson_orignal.setText(shops.toString());
        tv_gson_last.setText(json);
    



五、FastJson解析



(1)将json格式的字符串解析为对象

    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);

        // 3 显示数据
        tv_fastjson_orignal.setText(json);
        tv_fastjson_last.setText(shopInfo.toString());
    


(2)将json字符串解析成对象的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);

        // 3 显示数据
        tv_fastjson_orignal.setText(json);
        tv_fastjson_last.setText(shopInfos.toString());
    

(3)将java对象转换成json字符串

    private void javaToJsonObjectByFastJson() 

        // 1 创建一个Java对象
        ShopInfo shopInfo = new ShopInfo(1, "鲍鱼", 250.0, "baoyu");

        // 2 生成JSON数据
        String json = JSON.toJSONString(shopInfo);

        // 3 显示数据
        tv_fastjson_orignal.setText(shopInfo.toString());
        tv_fastjson_last.setText(json);
    

(4)将java对象List转换成json字符串

    private void javaToJsonArrayByFastJson() 

        // 1 创建一个Java集合
        List<ShopInfo> shops = new ArrayList<>();

        ShopInfo baoyu = new ShopInfo(1, "鲍鱼", 250.0, "baoyu");
        ShopInfo longxia = new ShopInfo(2, "龙虾", 251.0, "longxia");

        shops.add(baoyu);
        shops.add(longxia);

        // 2 生成JSON数据
        String json = JSON.toJSONString(shops);

        // 3 显示JSON数据
        tv_fastjson_orignal.setText(shops.toString());
        tv_fastjson_last.setText(json);

    






与50位技术专家面对面 20年技术见证,附赠技术全景图

以上是关于json的解析的主要内容,如果未能解决你的问题,请参考以下文章

啤酒小龙虾,足球世界杯!今天就用Python分析哪里的小龙虾最好吃

tensorflow线性回归预测鲍鱼数据

望海水产小龙虾养殖基地

scss GoogleFonts - 龙虾

成语咸鱼翻身

2018投资创业好项目,就选望海水产小龙虾养殖