Android之JSON解析

作者: 程序猿在广东 | 来源:发表于2016-12-26 15:14 被阅读1874次

    尊重原创,转载请注明:From zsml2016(http://blog.csdn.net/qq_29269233)Power byzsml2016侵权必究!

    一、'JSON'是什么鬼?
    JSON是一种轻量级的数据交换格式,它的全称为“JavaScript Object Notation”;它是基于JavaScript编程语言ECMA-262 3rd Edition-December 1999标准的一种轻量级的数据交换格式,主要用于跟服务器进行交换数据。与JSON相比XML也是一种数据交换格式,XML可以作为跨平台的数据交换格式,但是在JS(JavaScript的简写)中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理。好吧,说到这里据我所做的项目来看,当下的服务器与客户端数据交换几乎都是用JSON了,所以作为移动开发者的我们务必要吃透JSON解析。接下来主要从以下几个方面来说明JSON。

    二、JSON的特点:
    1、JSON比XML的数据传递的有效性高;
    2、JSON完全独立于编程语言;
    3、JSON的本质是具有特定格式的字符串;
    4、易于人阅读和编写,同时也易于机器解析和生成。

    三、JSON数据格式(JSON对象、JSON数组):
    1、JSON对象:{ }

    结构:{key1:value1,key2:value2,key3:value3}
    key的数据类型:字符串
    value的数据类型:字符串、数值、null、JSON对象、JSON数组
    例子:

    {  " name " : " luoweichao ", " blogUrl " : " luoweichao.top "  } 
    //以key/value键值对形式构建的,正确
    
    {  " name " : " luoweichao ", " luoweichao.top "  }
    //没有以key/value键值对形式构建的,错误
    

    2、JSON数组:[ ]

    结构:[value1,value2,value3]
    value的数据类型:字符串、数值、null、JSON对象、JSON数组
    例子:

    [ " 1 " , " csdn " , {  " name " : " luoweichao ", " blogUrl " : " luoweichao.top "  }  ]  //正确
    
    [ " 1 " , " name " : " luoweichao "  ]  //错误
    

    四、JSON解析方向:
    1、将Java对象(包括集合)转换成JSON格式字符串;(服务端)
    2、将JSON格式字符串转换成Java对象(包括集合)。(客户端)
    3、JSON和Java之间的转换关系:
    JSON中的对象对应着Java中的对象;
    JSON中的数组对应这Java中的集合。

    五、JSON解析技术:
    1、Android原生技术;
    2、Gson框架技术;
    3、FastJson框架技术。

    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 = "{\n" +
    "\t"id":2, "name":"金鱼", \n" +
    "\t"price":12.3, \n" +
    "\t"imagePath":"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg"\n" +
    "}\n";

       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:JSONArrayJSONArray(String json);将json字符串解析成json数组;
    int length();得到json数组中元素的个数;
    XxxgetXxx(int s) ;根据下标得到json数组中对应的元素数据。
    示例代码:
    (1)获取或创建JSON数据:

    [java] view plain copy

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

    (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 = "{\n" +
    "\t"id":2, "name":"金鱼", \n" +
    "\t"price":12.3, \n" +
    "\t"imagePath":"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg"\n" +
    "}\n";

       // 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 = "[\n" +
    " {\n" +
    " "id": 1,\n" +
    " "imagePath": "http://blog.csdn.net/qq_29269233/f1.jpg",\n" +
    " "name": "金鱼1",\n" +
    " "price": 12.3\n" +
    " },\n" +
    " {\n" +
    " "id": 2,\n" +
    " "imagePath": "http://blog.csdn.net/qq_29269233/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_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 = "{\n" +
    "\t"id":2, "name":"金鱼", \n" +
    "\t"price":12.3, \n" +
    "\t"imagePath":"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg"\n" +
    "}\n";

       // 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 = "[\n" +
    " {\n" +
    " "id": 1,\n" +
    " "imagePath": "http://blog.csdn.net/qq_29269233/f1.jpg",\n" +
    " "name": "金鱼1",\n" +
    " "price": 12.3\n" +
    " },\n" +
    " {\n" +
    " "id": 2,\n" +
    " "imagePath": "http://blog.csdn.net/qq_29269233/f2.jpg",\n" +
    " "name": "金鱼2",\n" +
    " "price": 12.5\n" +
    " }\n" +
    "]";

      // 2 解析JSON数据  
       List<ShopInfo> shopInfos = JSON.parseArray(json, ShopInfo.class);  
    
       // 3 显示数据  
       tv_fastjson_last.setText(shopInfos.toString());  
    

    3、同样Fastjson也可以将Java对象、Java对象的List 转换为json字符串{};有兴趣的就去研究一下哈。
    到此为止,算是比较详细地介绍了json解析了。

    更多精彩内容请关注本人博客:http://blog.csdn.net/qq_29269233

    相关文章

      网友评论

        本文标题:Android之JSON解析

        本文链接:https://www.haomeiwen.com/subject/uimjvttx.html