JSON 构建和解析

来源:互联网 发布:淘宝会员v0等级有什么 编辑:程序博客网 时间:2024/06/06 04:42

最近移动开发课程学到了JSON解析,想起去年十月一的时候,老班问我有没有用过OkHttp,有没有用过网上的开放接口解析JSON创建自己的APP,当时听得一脸懵逼啊。之后深觉需要发粪学习,直至今日,还是菜鸡一枚~(@^_^@)~
好在Android开发的基础知识还是及时补上了,对于JSON解析,也是用过挺多次的了,是时候做个总结了。写的简单点,希望以前没了解过的童鞋能很轻松的从这篇博客里初步认识JSON,并学会去解析各种各样JSON格式的数据。

1. 那么什么是JSON呢?为什么要用JSON格式传递数据?

JSON是一种取代XML的数据交换格式,是相较于XML,JSON的数据文件更小,但表达能力却丝毫不弱。正因为它的小巧,在网络传输中,将需要更少的流量,从而也可以加快传输速度。JSON就是一个字符串,只不过对象以及对象的元素(值)会使用特定的符号标注。下面简单看下JSON的语法:
{}  // 双括号内表示一个对象[]  // 中括号内表示一个数组""  // 双引号内表示属性或值:   // 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
完整的JSON格式的数据,是这样的:
{"city":"Beijing","street":"Chaoyang Road","postcode":"100025","delicacy":["烤鸭","炸酱面"]}
其中需要注意的是,Object(对象)可以嵌套表示,如下:
{"name":"Michael","address":{"city":"Beijing","street":"Chaoyang Road","postcode":100025}}

先来看下我们要用的JSON数据

{    "name": "liweiyong",    "age": "100",    “phone”: [        "12345678",        "87654321"    ],    "address": {        "province": "jiangsu",        "country": "china"    },    "married": false}

DEMO

2. 如何用Java代码构建一个JSON格式的数据?

废话不多说,直接看代码(别人跟我讨论什么问题,我就喜欢直接上代码, 理解起来会更快)
// 生成JSONprivate JSONObject createJSONObject1() {    JSONObject person = new JSONObject(); // 首先创建一个JSONObject 对象(person)    try {        person.put("name", "liweiyong"); // 在 person 中按照"键值"对应添加数据        person.put("age", 100);        JSONArray phone = new JSONArray();  // 创建一个JSONArray(数组)存储两个手机号码        phone.put("12345678"); // 向 JSONArray 中按照"键值"对应关系填入数据        phone.put("87654321");        person.put("phone", phone); // 将数组添加到 person 对象中        JSONObject address = new JSONObject(); // 创建一个新的 JSONObject 对象(address),存储家庭住址信息        address.put("country", "china");    // address 添加国家        address.put("province", "jiangsu"); // 添加省份        person.put("address", address); // 将 address 对象添加到 person 对象中,即嵌套对象        person.put("married", false);    } catch (JSONException e) {        e.printStackTrace();    }    return person;}
上面每行代码几乎我都写了注释,稍微有一点Java基础的人相信也能一眼看得懂吧。

3. 如何用解析JSON格式的数据?

上代码!
// 解析JSONprivate String parseJSONObject1(String t) {    // 使用 StringBuilder 比 String 拼接字符串效率更高    StringBuilder date = new StringBuilder();    try {        JSONObject jsonObj = new JSONObject(t); // 将需要解析的JSON数据构建成JSONObject        String name = jsonObj.getString("name"); // 使用 getString(键) 方法得到 name 值        int age = jsonObj.getInt("age"); // 使用 getInt(键) 方法得到 name 值        JSONArray phone = jsonObj.getJSONArray("phone"); // 使用 getJSONArray(键) 得到 phone 数组        String[] phones = new String[phone.length()]; // 创建 phones 数组存储电话号码        for (int i = 0; i < phone.length(); i++) {  // 对 phone 进行遍历            phones[i] = phone.get(i).toString();        }        JSONObject address = jsonObj.getJSONObject("address"); // 使用 getJSONObject(键) 得到嵌套的 address 对象        String country = address.getString("country");  // 下面类似,无非都是用 get 方法获取各种类型的数据        String province = address.getString("province");        Boolean married = jsonObj.getBoolean("married");        // 将上面获取到的数据拼接成字符串        date.append("name:" + " ");        date.append(name);        date.append("\n");        date.append("age:" + " ");        date.append(age);        date.append("\n");        date.append("phone:" + " ");        for (int i = 0; i < phones.length; i++) {            date.append(phones[i] + "  ");        }        date.append("\n");        date.append("address:" + " ");        date.append(country + " ");        date.append(province);        date.append("\n");        date.append("married:" + " ");        date.append(married);    } catch (JSONException e) {        e.printStackTrace();    }    return date.toString();}
还是很简单的吧,JSON解析无非就是先用JSON格式的字符串构建成JSONObject对象,然后再通过这个对象的get方法取出各种类型的值,数组,对象。

4. 不得不说的 Gson

文章上面的解析和构建JSON步骤有没有发现非常繁琐,如果要把JSON数据转化为一个实体对象,还要新建对象,为每个属性单独赋值,步骤会更多,使用GOSN就可以将原本繁杂的步骤变得异常简洁。Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。简单就是说,通过Gson,你可以将一个Java实体对象直接转化为JSON,JSON也可以直接转化为一个Java实体对象。要用Gson构建和解析JSON,需要新建一个Bean(实体对象类),而且这个Bean文件内容要和JSON数据类型一一对应。

使用Gson构建JSON

使用GSON最关键的是创建一个或多个合适的Bean,我这里给个例子,好好体会 O(∩_∩)O ,还是用上面的JSON数据,我把它拿下来,方便看着理解我建的Bean。
{    "name": "liweiyong",    "age": "100",    “phone”: [        "12345678",        "87654321"    ],    "address": {        "province": "jiangsu",        "country": "china"    },    "married": false}
这个JSON数据外面一个Object,内部还嵌套着一个名为address的Object,先建里面的address类。
package com.example.sunny.practice_217;/** * Created by Sunny on 2017/2/18. * Email:670453367@qq.com * Description: Address 实体类 */public class Address {    private String province;    private String country;    public String getProvince() {        return province;    }    public void setProvince(String province) {        this.province = province;    }    public String getCountry() {        return country;    }    public void setCountry(String country) {        this.country = country;    }}

类的名称随意,但里面的属性名必须和JSON中相应的字段一致,这样Gson解析的时候才能一一映射。还有外面的类,下面代码:

package com.example.sunny.practice_217;/** * Created by Sunny on 2017/2/18. * Email:670453367@qq.com * Description: Person 实体类 */public class Person {    private String name;    private int age;    private String[] phone;    private Boolean married;    private Address address;    public Person() {}    public Person(String name, int age, String[] phone, Boolean married) {        this.name = name;        this.age = age;        this.phone = phone;        this.married = married;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String[] getPhone() {        return phone;    }    public void setPhone(String[] phone) {        this.phone = phone;    }    public Boolean getMarried() {        return married;    }    public void setMarried(Boolean married) {        this.married = married;    }    public Address getAddress() {        return address;    }    public void setAddress(Address address) {        this.address = address;    }}
注意Person属性里有一句“private Address address;”,然后address还有一个get方法和一个set方法。这样,就把Address嵌套在Person类里。和我们的JSON数据相匹配了。剩下的构建和解析就很简单了。注意以下两句就行。String json = new Gson().toJson(person, Person.class); // 传入一个实体化对象和类的这个类,构建一个JSON格式的字符串Person person = new Gson().fromJson(json2, Person.class); // 传入一个JSON格式的字符串数据和实体类,解析成一个实体类对象就这两句足够了,Gson难就难在怎么根据数据构建出合适的Bean,构建解析只一句话搞定。下面是我写的完整的构建和解析方法。
// 通过 Gson 将 Person 对象实体化为 JSONprivate String ByGson() {    // 创建对象,给对象属性赋值    Person person = new Person();    person.setAge(100);    person.setName("liweiyong");    person.setMarried(false);    person.setPhone(new String[]{"12345678", "87654321"});    Address address = new Address();    address.setProvince("jiangsu");    address.setCountry("china");    person.setAddress(address);    // 使用toJson()构建JSON    String json = new Gson().toJson(person, Person.class);    return json;}// 将 JSON 解析成 Person 实体对象private Person parseJSONObjectByGson(String json2) {    // 用fromJson()将JSON字符串转化为Person对象    Person person = new Gson().fromJson(json2, Person.class);    return person;}
其实XML和JSON解析都类似,学会了JSON解析,XML解析上网查查博客也就差不多,而且现在XML用的越来越少,基本都是使用JSON,学会JSON解析,是每个程序员的基础课程。希望看到这里的人,能从此篇博客当中有所收获。由于个人水平有限,文章所介绍的知识有错误和不准确的地方,欢迎大家在下面留言区指出,与君共勉,一起进步。下面按钮你不“顶”一下吗? 哈哈哈······

DEMO地址:
https://github.com/SunnyGZY/Practice_217

2 0