zoukankan      html  css  js  c++  java
  • Android项目之JSON解析(3种解析技术详解)

    一、用Android原生技术解析JSON:

    特点:很麻烦,对于复杂的json数据解析很容易出错!(不推荐使用)

    1、解析JSON对象的API:JsonObject

    JSONObject(String json);将Json字符串解析成Json对象;

    XxxgetXxx(String name) ;根据name在json对象中得到相应的value。

    示例代码:

    (1)获取或创建JSON数据(为了方便,这里就直接创建了):


    [java] view plain copy
    String json = "{ " +  
                   " "id":2, "name":"金鱼",  " +  
                   " "price":12.3,  " +  
                   " "imagePath":"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg" " +  
                   "} ";  
      
           ShopInfo shopInfo = null;  
    (2)解析Json对象:


    [java] view plain copy
     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();  
            }  
    注意:这里记得要加try_catch异常处理。

    (3)创建JavaBean类,并显示解析后的数据:


    [java] view plain copy
    tv_native_last.setText(shopInfo.toString());  


    2、解析Json数组的API:JSONArray
    JSONArray(String json);将json字符串解析成json数组;

    int length();得到json数组中元素的个数;

    XxxgetXxx(int s) ;根据下标得到json数组中对应的元素数据。

    示例代码:

    (1)获取或创建JSON数据:


    [java] view plain copy
    String json = "[ " +  
                   "    { " +  
                   "        "id": 1, " +  
                   "        "imagePath": "http://blog.csdn.net/qq_29269233/f1.jpg", " +  
                   "        "name": "金鱼1", " +  
                   "        "price": 12.3 " +  
                   "    }, " +  
                   "    { " +  
                   "        "id": 2, " +  
                   "        "imagePath": "http://blog.csdn.net/qq_29269233/f2.jpg", " +  
                   "        "name": "金鱼2", " +  
                   "        "price": 12.5 " +  
                   "    } " +  
                   "]";  

    (2)解析json数组:


    [java] view plain copy
    try {  
                JSONArray jsonArray = new JSONArray(json);  
      
                for (int i = 0; i < jsonArray.length(); 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");  
      
                        // 封装Java对象  
                        ShopInfo shopInfo = new ShopInfo(id, name, price, imagePath);  
      
                        shops.add(shopInfo);  
                    }  
                }  
            } catch (JSONException e) {  
                e.printStackTrace();  
            }  

    (3)显示解析后的数据:

    [java] view plain copy
    tv_native_last.setText(shops.toString());  

    到此为止,这就是用原生的技术去解析json了,至于复杂特殊的json数据怎样去解析,也是大同小异了,一层一层解析就对了!

    二、用Gson框架技术解析JSON:

    特点:解析没那么麻烦,代码量简洁,可以很方便地解析复杂的Json数据,而且谷歌官方也推荐使用。

    先放出jar包的下载地址:https://mvnrepository.com/artifact/com.google.code.gson/gson


    如过用Android Studio做开发的话,可以通过Gradle,直接添加依赖,不用下载jar包,很方便,如下:


    1、用Gson解析JSON对象:

    (1)将gson的jar包导入到项目libs目录下,或者直接通过Gradle添加依赖:


    [java] view plain copy
    compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'  

    (2)创建Gson对象:

    [java] view plain copy
    Gson gson = new Gson();  

    (3)通过创建的Gson对象调用fromJson()方法,返回该json数据对象的Java对象;

    [java] view plain copy
    ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);  

    注意要记得创建对象的JavaBean类;要求json对象中的key的名称与Java对象的JavaBean类中的属性名要相同,否则解析不成功!


    示例代码如下:

    [java] view plain copy
    // 1 获取或创建JSON数据  
           String json = "{ " +  
                   " "id":2, "name":"金鱼",  " +  
                   " "price":12.3,  " +  
                   " "imagePath":"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg" " +  
                   "} ";  
      
           // 2 解析JSON数据  
           Gson gson = new Gson();  
      
           ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);  
      
           // 3 展示数据  
           tv_gson_last.setText(shopInfo.toString());  

    2、用Gson解析JSON数组:
    (1)(2)与上面相同,要用Gson就要先添加依赖,然后创建Gson对象;

    (3)通过创建的Gson对象调用fromJson()方法,返回该json数据对应的Java集合。

    这里但强调一下:要记得创建对象的JavaBean类;要求json对象中的key的名称与Java对象的JavaBean类中的属性名要相同,否则解析不成功!


    示例代码如下:


    [java] view plain copy
    // 1 获取或创建JSON数据  
           String json = "[ " +  
                   "    { " +  
                   "        "id": 1, " +  
                   "        "imagePath": "http://blog.csdn.net/qq_29269233/f1.jpg", " +  
                   "        "name": "金鱼1", " +  
                   "        "price": 12.3 " +  
                   "    }, " +  
                   "    { " +  
                   "        "id": 2, " +  
                   "        "imagePath": "http://blog.csdn.net/qq_29269233/f2.jpg", " +  
                   "        "name": "金鱼2", " +  
                   "        "price": 12.5 " +  
                   "    } " +  
                   "]";  
      
           // 2 解析JSON数据  
           Gson gson = new Gson();  
      
           List<ShopInfo> shops = gson.fromJson(json, new TypeToken<List<ShopInfo>>() {  
           }.getType());  
      
           // 3 展示数据  
           tv_gson_last.setText(shops.toString());  

    还是那句话,复杂特殊的都是大同小异,理解了方法就没问题了!
    3、Gson还可以将Java对象、Java对象的List 转换为json字符串{};有兴趣的就去研究一下哈。

    三、用Fastjson框架技术解析JSON:

    特点:Fastjson是用Java语言编写的高性能功能完善的JSON库。它采用了一种“假定有序、快速匹配”的算法,

    把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。

    Fastjson是阿里巴巴开源框架,已经开源到github上了,地址为:https://github.com/alibaba/fastjson

    在github上,我还专门留意了这个,哈哈,gson和fastjson比起来,gson就是“乌龟”


    要使用Fastjson,也是想Gson一样,先导入jar包,或者在Gradle中添加依赖:


    [java] view plain copy
    compile 'com.alibaba:fastjson:1.1.55.android'  

    添加好依赖后就可以使用Fastjson了!

    1、用Fastjson解析JSON对象:

    利用Fastjson的JSON调用parseObject()方法,获取转换后的Java对象。

    注意要记得创建对象的JavaBean类;要求json对象中的key的名称与Java对象的JavaBean类中的属性名要相同,否则解析不成功!


    示例代码:


    [java] view plain copy
    // 1 获取或创建json数据  
           String json = "{ " +  
                   " "id":2, "name":"金鱼",  " +  
                   " "price":12.3,  " +  
                   " "imagePath":"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg" " +  
                   "} ";  
      
           // 2 解析JSON数据  
           ShopInfo shopInfo = JSON.parseObject(json, ShopInfo.class);  
      
           // 3 显示数据  
           tv_fastjson_last.setText(shopInfo.toString());  

    2.用Fastjson解析JSON数组:
    利用Fastjson的JSON调用parseArray()方法,获取转换后的Java集合。

    这里但强调一下:要记得创建对象的JavaBean类;要求json对象中的key的名称与Java对象的JavaBean类中的属性名要相同,否则解析不成功!


    示例代码:


    [java] view plain copy
    // 1 获取或创建json数据  
           String json = "[ " +  
                   "    { " +  
                   "        "id": 1, " +  
                   "        "imagePath": "http://blog.csdn.net/qq_29269233/f1.jpg", " +  
                   "        "name": "金鱼1", " +  
                   "        "price": 12.3 " +  
                   "    }, " +  
                   "    { " +  
                   "        "id": 2, " +  
                   "        "imagePath": "http://blog.csdn.net/qq_29269233/f2.jpg", " +  
                   "        "name": "金鱼2", " +  
                   "        "price": 12.5 " +  
                   "    } " +  
                   "]";  
      
          // 2 解析JSON数据  
           List<ShopInfo> shopInfos = JSON.parseArray(json, ShopInfo.class);  
      
           // 3 显示数据  
           tv_fastjson_last.setText(shopInfos.toString());  

    3、同样Fastjson也可以将Java对象、Java对象的List 转换为json字符串{};有兴趣的就去研究一下哈。

  • 相关阅读:
    查依赖的时候发现 ldd: not found 的话,可以用 readelf 喔。
    【rv1126】host Python 没有内置 pip ,所以需要手动调用 get-pip.py 为 Python pip 安装指定包。
    MaixPy3 Linux 通用模块设计
    剑指 Offer 27. 二叉树的镜像
    Pycocotools安装艰辛历程
    性能测试之常见性能指标
    libuv事件循环中的三种句柄
    libuv线程通信
    libuv工作队列
    libuv中实现tcp服务器
  • 原文地址:https://www.cnblogs.com/Alex80/p/13130516.html
Copyright © 2011-2022 走看看