Android利用Gson解析Json数据

其实,要创建和解析JSON数据,也可以使用GSON来完成。GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。使用GSON,可以很容易的将一串JSON数据转换为一个Java对象,或是将一个Java对象转换为相应的JSON数据。 

 

GSON的两个重要方法

  在GSON的API中,提供了两个重要的方法:toJson()和fromJson()方法。其中,toJson()方法用来实现将Java对象转换为相应的JSON数据,fromJson()方法则用来实现将JSON数据转换为相应的Java对象。


toJson()方法

  toJson()方法用于将Java对象转换为相应的JSON数据,主要有以下几种形式:

  (1)String toJson(JsonElement jsonElement);

  (2)String toJson(Object src);

  (3)String toJson(Object src, Type typeOfSrc);

  其中,方法(1)用于将JsonElement对象(可以是JsonObject、JsonArray等)转换成JSON数据;方法(2)用于将指定的Object对象序列化成相应的JSON数据;方法(3)用于将指定的Object对象(可以包括泛型类型)序列化成相应的JSON数据。

 

fromJson()方法

  fromJson()方法用于将JSON数据转换为相应的Java对象,主要有以下几种形式:

  (1)<T> T fromJson(JsonElement json, Class<T> classOfT);

  (2)<T> T fromJson(JsonElement json, Type typeOfT);

  (3)<T> T fromJson(JsonReader reader, Type typeOfT);

  (4)<T> T fromJson(Reader reader, Class<T> classOfT);

  (5)<T> T fromJson(Reader reader, Type typeOfT);

  (6)<T> T fromJson(String json, Class<T> classOfT);

  (7)<T> T fromJson(String json, Type typeOfT);

  以上的方法用于将不同形式的JSON数据解析成Java对象。

下面为具体的演示:
1.利用gson解析json字符串为单个对象
{
    "createDate": "2015-02-01 10:39:50",
    "id": "1",
    "name": "传说之美",
    "password": "123456"
}
先定义一个account类,属性有id、name、password、createDate。
 
public class Account {
    private String id;
    private String password;
    private String name;
    private String createDate;
    public Account() {
        super();
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCreateDate() {
        return createDate;
    }
    public void setCreateDate(String createDate) {
        this.createDate = createDate;
    }
    @Override
    public String toString() {
        return "Account [id=" + id + ", password=" + password + ", name=" + name + ", createDate=" + createDate + "]\n\n";
    }
}
// 利用gson解析json字符串为单个对象
Account account1 = gson.fromJson(jsonString, Account.class);

2.利用gson解析json字符串为单个数组
[
    {
        "id": "2",
        "createDate": "2015-02-01 11:21:27",
        "password": "123456",
        "name": "传说"
    },
    {
        "id": "2",
        "createDate": "2015-02-01 11:21:27",
        "password": "123456",
        "name": "之美"
    }
]
// 更快捷地解析成List
Type listType = new TypeToken<ArrayList<Account>>(){}.getType();
ArrayList<Account> accsList = new Gson().fromJson(accountArray.toString(), listType);

3.利用Gson解析对象嵌套对象的json
 
嵌套的json类似如下
  
{
    "member": {
        "id": "4",
        "name": "我是传说"
    },
    "id": "4",
    "createDate": "2015-02-02 12:03:32",
    "password": "888888",
    "name": "传说之美"
}
1、定义一个member类
 
public class Member {
    private String id;
    private String name;
    public Member() {
        super();
    }
        public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Member [id=" + id + ", name=" + name + "]\n\n";
    }
}

3.1如果单纯的解析里面的json对象,可以这样做:
  // 这里用isNull来判断是否存在这个object,存在就拿出member的JSONObject
JSONObject memberObject = null;
if(!object.isNull("member")){
    try {
        memberObject = object.getJSONObject("member");
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
Member member5 = null;
if(null != memberObject){
    member5 = gson.fromJson(memberObject.toString(), Member.class);
    Log.i("解析对象嵌套对象的json", member5.toString());
}

3.2如果解析整个数据:
定义一个类
 public class AccountObject {
    private String id;
    private String password;
    private String name;
    private String createDate;
    private Member;
    ..............省略了get和set方法,可自行补充
    @Override
    public String toString() {
        return "AccountObject [id=" + id + ", password=" + password + ", name=" + name + ", createDate=" + createDate + ","+ member.toString() + "]\n\n";
    }
}
生成json并解析
  AccountObject accountObject = gson.fromJson(object.toString(), AccountObject.class);

4.利用Gson解析对象里面嵌套对象和数组
                 String json = {"a":"100","b":[{"b1":"b_value1","b2":"b_value2"},{"b1":"b_value1","b2":"b_value2"}],"c":{"c1":"c_value1","c2":"c_value2"}}
                首先我们需要定义一个序列化的Bean,这里采用内部类的形式,看起来会比较清晰一些:
                public class JsonBean {
                         public String a;
                         public List<B> b;
                         public C c;

                         public static class B {
                                  public String b1;
                                  public String b2;
                        }
    
                        public static class C {
                                 public String c1;
                                 public String c2;
                       }
              }
             很多时候大家都是不知道这个Bean是该怎么定义,这里面需要注意几点:
             1、内部嵌套的类必须是static的,要不然解析会出错;
             2、类里面的属性名必须跟Json字段里面的Key是一模一样的;
             3、内部嵌套的用[]括起来的部分是一个List,所以定义为 public List<B> b,而只用{}嵌套的就定义为 public C c,
                  具体的大家对照Json字符串看看就明白了,不明白的我们可以互相交流,本人也是开发新手!
              Gson gson = new Gson();
              java.lang.reflect.Type type = new TypeToken<JsonBean>() {}.getType();
              JsonBean jsonBean = gson.fromJson(json, type);
              然后想拿数据就很简单啦,直接在jsonBean里面取就可以了!

猜你喜欢

转载自blog.csdn.net/qq_22118507/article/details/51658583