1. 程式人生 > >Google的JSON解析庫Gson的使用

Google的JSON解析庫Gson的使用

  該專案的github地址:Gson
  
  

JsonObject的解析

  比如你有下面這樣的一個JsonObject:  

{
    "_id":"OXBGzgE9exNkAP6v8reFIDcZOwrG27MInNXZ4aRXSQUX2GK7OD3i7qXj3HmeYOGg",
    "ttl":7200,
    "created":'2015-12-16T10:51:28.845Z',
    "userId":'5671423088147fb8e63e1d42',
    "name":"某某",
    "school":"某某",
    "phone":"某某",
    "sign":"某某"
}

  先定義一個與其對應的類,如下所示:

public class User {

    private String _id;
    private String ttl;
    private String created;
    private String userId;
    private String name;
    private String school;
    private String phone;
    private String sign;

    //省略get,set,可以通過IDE快速生成

}

  然後一句程式碼搞定:

//其中的s是你從伺服器獲取的JSON字串
User user = new Gson().fromJson(s, User.class);  

  再看一種情況,如果的你的JsonObject變成下面這樣:

{
    "_id": "OXBGzgE9exNkAP6v8reFIDcZOwrG27MInNXZ4aRXSQUX2GK7OD3i7qXj3HmeYOGg", 
    "ttl": 7200,
    "created": '2015-12-16T10:51:28.845Z',
    "userId": '5671423088147fb8e63e1d42',   
    "user": {
        "name": "某某",
        "school": "某某",
        "phone": "某某",
        "sign": "某某"
    }
}  

  你可以通過內部類來解決,定義的與其對應的類如下:

public class Person {

    private String _id;
    private String ttl;
    private String created;
    private String userId;
    private User user;

    class User {

        private String name;
        private String school;
        private String phone;
        private String sign;

        //省略get,set,可以通過IDE快速生成

    }

    //省略get,set,可以通過IDE快速生成

}  

  用法同上,如下:

//其中的s是你從伺服器獲取的JSON字串
Person person = new Gson().fromJson(s, Person.class);

System.out.println(person.get_id());

System.out.println(person.getUser().getName());//獲取內部類的資料  

JsonArray的解析

  比如你有下面這樣的一個JsonArray:  

[
    {
        "title": "活動1",
        "authorName": "測試1",
        "id": "5672b729337626dd96fb52a2",
        "authorId": "5672b3f5337626dd96fb52a0",
        "keyword": "關鍵字:招新,報名,後端,Android",
        "imgUrl": "http://etuan.oss-cn-hangzhou.aliyuncs.com/images/551e910a8e3e731c230d8021/logo/1439479222561196823.png",
        "created": "2015-12-03T16:00:00.000Z",
        "started": "2015-12-03T16:00:00.000Z",
        "ended": "2015-12-03T16:00:00.000Z"
    },
    {
        "title": "活動2",
        "authorName": "測試2",
        "id": "5672b96a88b7c0a97d0259b3",
        "authorId": "5672b3f5337626dd96fb52a0",
        "keyword": "關鍵字:招新,報名,後端,Android",
        "imgUrl": "http://etuan.oss-cn-hangzhou.aliyuncs.com/images/551e910a8e3e731c230d8021/logo/1439479222561196823.png",
        "created": "2015-12-03T16:00:00.000Z",
        "started": "2015-12-03T16:00:00.000Z",
        "ended": "2015-12-03T16:00:00.000Z"
    }
]  

  同樣,先定義一個與其對應的類,如下所示:

import java.util.List;

public class Activties {

    private List<Activity> activities;

    class Activity {

        private String title;

        private String authorName;

        private String id;

        private String authorId;

        private String keyword;

        private String imgUrl;

        private String created;

        private String started;

        private String ended;

        //省略get,set,可以通過IDE快速生成

    }

    //省略get,set,可以通過IDE快速生成

}  

  不過這裡解析的程式碼有所不同,按照Gson User Guide這裡的說法應該是和Java泛型的型別擦除有關,解析程式碼示例如下:

//其中的s是你從伺服器獲取的JSON字串
List<Activties.Activity> activityList = new Gson().fromJson(s,
    new TypeToken<List<Activties.Activity>>(){}.getType());
System.out.println(activityList.get(0).getTitle());
System.out.println(activityList.get(1).getTitle());  

JsonObject和JsonArray互相多層巢狀的解析

  比如你有下面這樣的一個JSON字串要解析:  

{
    "a":"a_value",
    "b":
    [
        {"b1":"b1_value1","b2":"b2_value1"},
        {"b1":"b1_value2","b2":"b2_value2"}
    ],
    "c":
    {
        "c1":"c1_value",
        "c2":"c2_value",
        "c3":
        [
            {"c31":"c31_value1","c32":"c32_value1"},
            {"c31":"c31_value2","c32":"c32_value2"}
        ]
    }
}  

  其實也就是多套幾層內部類而已,對應類如下:

import java.util.List;

public class JsonBean {

    public String a;
    public List<B> b;
    public C c;

    class B {

        private String b1;
        private String b2;

        public String getB1() {
            return b1;
        }

        public String getB2() {
            return b2;
        }

    }

    class C {

        private String c1;
        private String c2;
        private List<C3> c3;

        class C3 {

            private String c31;
            private String c32;

            public String getC31() {
                return c31;
            }

            public String getC32() {
                return c32;
            }

        }

        public String getC1() {
            return c1;
        }

        public String getC2() {
            return c2;
        }

        public List<C3> getC3() {
            return c3;
        }

    }

    public String getA() {
        return a;
    }

    public List<B> getB() {
        return b;
    }

    public C getC() {
        return c;
    }

}  

  解析程式碼示例如下:  

//其中的s是你從伺服器獲取的JSON字串
JsonBean jsonBean = new Gson().fromJson(s,new TypeToken<JsonBean>(){}.getType());
System.out.println(jsonBean.getA());
System.out.println(jsonBean.getB().get(0).getB1());
System.out.println(jsonBean.getC().getC1());
System.out.println(jsonBean.getC().getC3().get(1).getC31());