其实,要创建和解析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里面取就可以了!