解析json数据:使用JsonObject解析json数据

在Android开发中,我们经常需要和服务器进行交互,进而获取到服务器上上的数据。服务器返回的数据一般有两种格式:1、json格式;2、xml格式,今天讲json格式的解析。

解析json数据通常有三种方式:第一种是使用Android中自带的JsonObject对象进行解析,这是一种最基础同时也是最麻烦的解析方式;第二种是使用Gson解析,Gson的效率并不是非常好,但是架不住他好用,所以一般都会使用Gson进行json数据的解析;第三种是fastjson,这是阿里开发的一个json数据解析框架,相比与Gson来说,fastjson的效率有这许多的提高。下面进行使用JsonObject对象进行解析数据。

拿到json数据时,我们可以在百度上搜索json数据在线解析从而非常方便的将获取的数据解析成更直观的数据格式;也可以进入下面网址http://www.bejson.com/json2javapojo/new/ 可以直接将json数据转换成Java bean对象!

1、使用的java bean的模版:

public class Person implements Serializable {
    private int id;
    private String name;
    private int age;

    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Person() {
    }
省略了相关的Setter、Getter和toString方法
}

2、只包含一个对象的json字符串:

{"persons":{"age":10,"id":1,"name":"jack"}}

解析方法:

    /**
     * 解析返回Person类
     *
     * @param data 获取到的数据
     * @return
     */
    public static Person getPerson(String data) throws JSONException {
        //将得到json数据转换为一个json对象
        JSONObject jsonObject = new JSONObject(data);
        //获取"persons"的json对象
        jsonObject = jsonObject.getJSONObject("persons");
        //通过相应的get方法,获取相应的属性
        int id = jsonObject.getInt("id");
        String name = jsonObject.getString("name");
        int age = jsonObject.getInt("age");
        //将获取到的数据放到一个Person对象中
        Person person = new Person(id, name, age);
        return person;
    }

3、含有多个对象的json字符串:

{"persons":[{"age":10,"id":1,"name":"jack"},{"age":11,"id":2,"name":"rose"},{"age":16,"id":3,"name":"tom"}]}

从数据中可以看出,这是一个含有一个数组的json数据,以下是解析方式:

    /**
     * 解析返回多个Person对象
     * @param data 传入的json数据
     * @return
     * @throws JSONException
     */
    public static List getPersons(String data) throws JSONException {
        List list = new ArrayList<>();
        //将得到json数据转换为一个json对象
        JSONObject jsonObject = new JSONObject(data);
        //获取"persons"的json对象,并将其转换为一个json数组
        JSONArray array = jsonObject.getJSONArray("persons");
        //通过循环获取数据,并放入list集合中
        for (int i = 0;iint id = array.getJSONObject(i).getInt("id");
            String name = array.getJSONObject(i).getString("name");
            int age = array.getJSONObject(i).getInt("age");
            Person person = new Person(id, name, age);
            list.add(person);
        }
        return list;
    }

我们仔细观察,在json数据体中会发现每一个每一个数据其实都是有一个key和一个value一一对应的,我们也可以将数据解析成一个Map的集合,方式和解析成一个bean很类似。

    /**
     * 解析返回多个Map对象
     * @param data 传入的json数据
     * @return
     * @throws JSONException
     */
    public static List<Map<String,Object>> getListMapPersons(String data) throws JSONException{
        List<Map<String,Object>> list = new ArrayList<>();
        //将得到json数据转换为一个json对象
        JSONObject jsonObject = new JSONObject(data);
        //获取"persons"的json对象,并将其转换为一个json数组
        JSONArray array = jsonObject.getJSONArray("persons");
        //通过循环获取数据,并放入list集合中
        for (int i = 0;i<array.length();i++){
            Map<String,Object> map = new HashMap<>();
            int id = array.getJSONObject(i).getInt("id");
            map.put("id",id);
            String name = array.getJSONObject(i).getString("name");
            map.put("name",name);
            int age = array.getJSONObject(i).getInt("age");
            map.put("age",age);
            list.add(map);
        }
        return list;
    }

4、解析只含有字符串的json数据

{"citys":["beijing","shagnhai","guangzhou"]}

解析方法:

public static List<String> getString(String data) throws JSONException {
        List<String> list = new ArrayList<>();
        //将得到json数据转换为一个json对象
        JSONObject jsonObject = new JSONObject(data);
        //获取"persons"的json对象,并将其转换为一个json数组
        JSONArray array = jsonObject.getJSONArray("citys");
        for (int i = 0; i < array.length(); i++) {
            list.add(array.getString(i));
        }
        return list;
    }

5、包含复杂对象的数据解析

{"persons":[{"age":10,"car":{"name":"zixingche","price":20000},"id":1,"name":"jack"},{"age":11,"car":{"name":"lvche","price":25000},"id":2,"name":"rose"},{"age":16,"car":{"name":"wulinghongguan","price":10000},"id":3,"name":"tom"}]}

相比较之前的的数据来说,这条数据只是相对复杂了一些。可以看作是一个java bean中包含了另一个java bean。以下是解析方式:
1、定义一个Car对象

public class Car implements Serializable {
    private String name;
    private int price;

    public Car(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public Car() {
    }
    这里省略了gettter、setter和toString方法
}

2、定义一个Person对象

public class Person implements Serializable {
    private int id;
    private String name;
    private int age;
    private Car car;

    public Person(int id, String name, int age, Car car) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.car = car;
    }

    public Person() {
    }
   这里省略了gettter、setter和toString方法
}

3、解析数据

    /**
     * 解析复杂类型的json数据
     * @param data
     * @return
     * @throws JSONException
     */
    public static List getComplexData(String data) throws JSONException {
        List list = new ArrayList<>();
        //将得到json数据转换为一个json对象
        JSONObject jsonObject = new JSONObject(data);
        //获取"persons"的json对象,并将其转换为一个json数组
        JSONArray array = jsonObject.getJSONArray("persons");
        //通过循环获取数据,并放入list集合中
        for (int i = 0; i < array.length(); i++) {
            int id = array.getJSONObject(i).getInt("id");
            String name = array.getJSONObject(i).getString("name");
            int age = array.getJSONObject(i).getInt("age");
            //获取到"car"是一个新的json对象
            jsonObject = array.getJSONObject(i).getJSONObject("car");
            String carName = jsonObject.getString("name");
            int carPrice = jsonObject.getInt("price");
            Car car = new Car(carName, carPrice);
            Person person = new Person(id, name, age, car);
            list.add(person);
        }
        return list;
    }

总体来说,使用JsonObject对象解析json数据还是比较简单的,只是写的很麻烦而已,如果是解析一个嵌套很多层的json数据时,会非常的麻烦!

你可能感兴趣的:(android,数据解析,java)