数据Android开发经验谈首页投稿(暂停使用,暂停投稿)

Android技能-创建Json文本及Json解析

2016-07-15  本文已影响410人  08dc70a40fb1

摘要:Json数据在安卓开发过程中是非常常见的,在请求服务器端数据的时候,服务器端返回的无非就是三种类型:HTML,XML,JSON。所以学习JSON对安卓程序员来说是非常重要的。

什么是JSON

JSON:JavaScript Object Notation。顾名思义,JSON数据是源自于JavaScript,学习过JavaScript(以下简称JS)的人都知道,我们在JS脚本里面创建对象时,都是以键值对的形式编写的。例如,我们在JS里面创建一个Json对象时是这么定义的:

var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};

很容易看出,属性之间是通过逗号分隔开,键与值之间是通过双引号分隔开,而JSON数据也是如此。

JSON的数据类型

json一共有两种数据结构。

JsonObject

一种是以 (key/value)对形式存在的无序的jsonObject对象。对象使用大括号括起来,属性之间使用逗号分隔开。

例如:{"name": "jack"}, 这就是一个最简单的json对象,对于这种数据格式,key值必须要是string类型,而对于value,则可以是string、number、object、array等数据类型。

JsonArray

另一种数据格式就是有序的value的集合,这种形式被称为是JsonArray。数组是值的有序集合,值与值之间使用逗号分隔开,集合用中括号括起来。

创建JSON文本

例如我们要创建以下类型的Jjson数据:

{"person":{"name":"zhangsan", "phone":["123", "456"],"address":"guangdong"}}

使用JSONOject和JSONArray创建

/**
 * 使用JsonObject和JsonArray创建JSON对象
 */
public void makeJson() {
    try {
        JSONObject object = new JSONObject();

        JSONObject person = new JSONObject();
        //名字
        person.put("name", "zhangsan");
        //电话
        JSONArray phone = new JSONArray();
        phone.put("123").put("456");
        person.put("phone", phone);
        //地址
        person.put("address", "guangdong");

        object.put("person", person);

        Log.i("JSON_LOG", object.toString());
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

输出结果

使用JsonStringer创建

/**
 * 通过JsonStringer创建JSON对象
 */
public void makeJsonStringer() {
    try {
        JSONStringer jsonText = new JSONStringer();
        // 首先是{,对象开始。object和endObject必须配对使用
        jsonText.object();

        jsonText.key("person");

        jsonText.object();

        jsonText.key("name");
        jsonText.value("zhangsan");

        jsonText.key("phone");
        // 键phone的值是数组。array和endArray必须配对使用
        jsonText.array();
        jsonText.value("123").value("456");
        jsonText.endArray();

        jsonText.key("address");
        jsonText.value("Guangdong");

        jsonText.endObject();

        jsonText.endObject();

        Log.i("JSON_LOG", jsonText.toString());
    } catch (JSONException ex) {
        throw new RuntimeException(ex);
    }
}

输出结果:

JSON解析

1. 解析{"key", "Object"}类型的

{"person":{"name":"zhangsan", "phone":["123", "456"],"address":"guangdong"}}

解析代码

/**
 * JSON解析
 * @param json
 * @return
 */
public static String JsonToString(String json) {
    Person person = new Person();
    try {
        //获取到整个Json数据
        JSONObject object = new JSONObject(json);
        //解析最外层,获得person键对应的object值
        JSONObject personObject = object.getJSONObject("person");
        //解析object值里面的每一个属性
        person.setName(personObject.getString("name"));
        //属性值是数组,则使用JSONArray获取
        JSONArray phoneArray = personObject.getJSONArray("phone");
        List<String> phone = new ArrayList<>();
        for (int i = 0; i < phoneArray.length(); i++) {
            phone.add((String) phoneArray.get(i));
        }
        person.setPhone(phone);
        person.setAddress(personObject.getString("address"));
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return person.toString();
}

结果

2. 解析{"Object"}类型

{"name":"zhangsan", "phone":["123", "456"],"address":"guangdong"}

这么解析:

 /**
 * 解析单个对象的JSON数据
 * @param json
 * @return
 */
public static String JsonParse(String json) {
    Person person = new Person();
    try {
        JSONObject personObject = new JSONObject(json);
        //解析object值里面的每一个属性
        person.setName(personObject.getString("name"));
        //属性值是数组,则使用JSONArray获取
        JSONArray phoneArray = personObject.getJSONArray("phone");
        List<String> phone = new ArrayList<>();
        for (int i = 0; i < phoneArray.length(); i++) {
            phone.add((String) phoneArray.get(i));
        }
        person.setPhone(phone);
        person.setAddress(personObject.getString("address"));
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return person.toString();
}

3. 解析{"value"}类型

["123", "456", "789"];

解析方法:

/**
 * 解析数组型的JSON数据
 * @param json
 * @return
 */
public static List<String> JsonParseToArray(String json){
    List<String> list = new ArrayList<>();
    try {
        JSONArray array = new JSONArray(json);
        for (int i=0; i<array.length(); i++){
            list.add((String) array.get(i));
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return list;
}

解析总结

JSON解析无非就是通过JSONObject和JSONArray不断地对数据进行解析,归根结底每一种数据都是可以分解为以上的三种最基本的解析,所以大家只要掌握好JSONObject和JSONArray,即便再复杂的数据类型,大家也可以解析得得心应手。

GSON

GSON是Google开发的开源的JAVA API,可以用于JSON的创建和JSON的解析。下面对GSON做一个最基本的介绍。更多了解 http://sites.google.com/site/gson/

首先需要下载GSON的jar包,自行度娘。

其次,我们使用GSON来创建JSON和解析JSON都要有相对应的JavaBean,所以GSON可以帮助我们更加简便地实现Bean和JSON的转换。

以下例子我们都是用Person类的JavaBean:

public class Person {
    private String name;
    private List<String> phone;
    private String address;

    public Person() {

    }

    public Person(String name, List<String> phone, String address) {
        this.name = name;
        this.phone = phone;
        this.address = address;
    }

    public String getName() {
        return name;
    }

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

    public List<String> getPhone() {
        return phone;
    }

    public void setPhone(List<String> phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", phone=" + phone +
                ", address='" + address + '\'' +
                '}';
    }
}

Bean转换为JSON

/**
 * GSON转换为JSON
 *
 * @return json
 */
public String beanToJson() {

    //赋值给一个person实例
    List<String> phone = new ArrayList<>();
    phone.add("123");
    phone.add("456");
    Person person = new Person("jack", phone, "Guangzhou");

    //实例化GSON
    Gson gson = new Gson();
    //调用gson.toJson将Bean转为JSON
    String json = gson.toJson(person);
    return json;
}

JSON转换为Bean

/**
 * JSON转换为Bean
 * @param json
 * @return
 */
public String jsonToBean(String json) {
    Person person = new Person();
    Gson gson = new Gson();
    //调用gson.fromJson将json转为bean
    person = gson.fromJson(json, Person.class);
    return person.toString();
}
上一篇下一篇

猜你喜欢

热点阅读