Android 之Json解析

本文来自http://blog.csdn.net/qq_29269233
Json是什么玩意儿?

JSON 是轻量级的文本数据交换格式
JSON 独立于语言 (单纯的数据格式,不受语言的约束)
JSON 具有自我描述性,更易理解

JSON数据格式(JSON对象、JSON数组)

1、JSON对象:{ }

结构:{key1:value1,key2:value2,key3:value3}

key的数据类型:字符串

value的数据类型:字符串、数值、null、JSON对象、JSON数组

例子:

{ ” name ” : ” apple”, ” price ” : ” five ” }以key/value键值对形式构建的,正确

{ ” name ” : ” apple “, ” five ” }没有以key/value键值对形式构建的,错误

2、JSON数组:[ ]

结构:[value1,value2,value3]

value的数据类型:字符串、数值、null、JSON对象、JSON数组

例子:

[ ” 1 ” , ” csdn ” , { ” name ” : ” apple “, ” price ” : ” five ” } ]正确

[ ” 1 ” , ” name ” : “apple ” ]错误

JSON解析方向:

1、将Java对象(包括集合)转换成JSON格式字符串;(服务端)

2、将JSON格式字符串转换成Java对象(包括集合)。(客户端)

3、JSON和Java之间的转换关系:

JSON中的对象对应着Java中的对象;

JSON中的数组对应这Java中的集合。

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

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

1、解析JSON对象的API:JsonObject

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

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

示例代码:

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

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

注意:这里记得要加try_catch异常处理。

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

    tv_native_last.setText(shopInfo.toString());

2、解析Json数组的API:JSONArray

JSONArray(String json);将json字符串解析成json数组;

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

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

示例代码:

(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数组:

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)显示解析后的数据:

   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目录下,或者直接通过build.gradle添加依赖:

implementation 'com.google.code.gson:gson:2.8.0'

(2)创建Gson对象:

 Gson gson = new Gson();

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

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

注意要记得创建对象的JavaBean类(用GsonFormat插件可以快速生成);要求json对象中的key的名称与Java对象的JavaBean类中的属性名要相同,否则解析不成功!

示例代码如下:

 // 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类中的属性名要相同,否则解析不成功!

示例代码如下:

 // 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字符串{};有兴趣的就去研究一下哈。

更加深入的解析请看大神的博客:
Android之JSON全面解析与使用
android json解析及简单例子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值