转自:http://www.cnblogs.com/liqw/p/4266209.html
目前手机端和服务端数据交流格式一般是json,而谷歌提供了Gson来解析json。下载Gson:https://code.google.com/p/google-gson/
下载的放在lib并导入,若出现错误:java.lang.NoClassDefFoundError: com.google.gson.Gson
是因为没有导入android-support-v4.jar,导入即可。
一、单个对象生成json
生成以下类,该怎么生成呢?
1
2
3
4
5
6
|
{ "createDate" : "2015-02-01 10:39:50" ,
"id" : "1" ,
"name" : "传说之美" ,
"password" : "123456"
} |
先定义一个account类,属性有id、name、password、createDate。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
public class Account {
private String id;
private String password;
private String name;
private String createDate;
public Account() {
super ();
}
public Account(String id, String password, String name, String createDate) {
super ();
this .id = id;
this .password = password;
this .name = name;
this .createDate = createDate;
}
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字符串了。
1
2
3
4
5
6
7
8
|
// 生成account对象 SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss" );
Account account = new Account( "1" , "123456" , "传说之美" , sdf.format( new Date()));
// 利用gson对象生成json字符串 Gson gson = new Gson();
String jsonString = gson.toJson(account); Log.i( "" , jsonString);
|
输入的log如下
二、解析json字符串为单个对象
在上面已生成了jsonString,那如何将其解析为单个对象,很简单。
1
2
3
|
// 利用gson解析json字符串为单个对象 Account account1 = gson.fromJson(jsonString, Account. class );
Log.i( "" , account1.toString());
|
看看输出的log
三、生成单个对象的json数组
什么事json数组,类似下面的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[ {
"id" : "2" ,
"createDate" : "2015-02-01 11:21:27" ,
"password" : "123456" ,
"name" : "传说"
},
{
"id" : "2" ,
"createDate" : "2015-02-01 11:21:27" ,
"password" : "123456" ,
"name" : "之美"
}
] |
生成json数组代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Account account2 = new Account( "2" , "123456" , "传说" , sdf.format( new Date()));
Account account3 = new Account( "2" , "123456" , "之美" , sdf.format( new Date()));
List<Account> accountList = new ArrayList<Account>();
accountList.add(account2); accountList.add(account3); JSONArray accountArray = new JSONArray();
for ( int i = 0 ; i < accountList.size(); i++) {
String accountStr = gson.toJson(accountList.get(i));
JSONObject accountObject;
try {
accountObject = new JSONObject(accountStr);
accountArray.put(i, accountObject);
} catch (JSONException e) {
e.printStackTrace();
}
} Log.i( "" , accountArray.toString());
|
log的输出为
四、由多个单个对象的json数组解析为对个单个对象
多个单个对象组成的json数组解析如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// 解析json数组 List<Account> accountList2 = new ArrayList<Account>();
for ( int i= 0 ;i<accountArray.length(); i++){
JSONObject jsonObject = null ;
try {
jsonObject = accountArray.getJSONObject(i);
} catch (JSONException e) {
e.printStackTrace();
}
if (jsonObject != null ){
Account tempAccount = gson.fromJson(jsonObject.toString(), Account. class );
accountList2.add(tempAccount);
}
} Log.i( "accountList2" , accountList2.toString());
|
输出的log
或者用更快捷的转化方法
1
2
3
4
5
6
|
Account[] accountArrays = new Gson().fromJson(accountArray.toString(), Account[]. class );
for ( int i= 0 ;i<accountArrays.length;i++){
Log.i( "accountArrays" ,accountArrays[i].toString());
} // 转化为List List<Account> foosList = Arrays.asList(accountArrays); |
更快捷地解析成List
1
2
3
4
|
// 更快捷地解析成List Type listType = new TypeToken<ArrayList<Account>>(){}.getType();
ArrayList<Account> accsList = new Gson().fromJson(accountArray.toString(), listType);
Log.i( "accsList" ,accsList.toString());
|
五、生成一个对象嵌套对象的json
嵌套的json类似如下
1
2
3
4
5
6
7
8
9
10
|
{ "member" : {
"id" : "4" ,
"name" : "我是传说"
},
"id" : "4" ,
"createDate" : "2015-02-02 12:03:32" ,
"password" : "888888" ,
"name" : "传说之美"
} |
生成这个json有2种方法。
1、再添加一个member类,像添加account类一样添加即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
public class Member {
private String id;
private String name;
public Member() {
super ();
}
public Member(String id, String name) {
super ();
this .id = id;
this .name = name;
}
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" ;
}
} |
生成代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// 生成对象嵌套对象的json Account account4 = new Account( "4" , "888888" , "传说之美" , sdf.format( new Date()));
Member member = new Member( "4" , "我是传说" );
String accountStr = gson.toJson(account4); String memberStr = gson.toJson(member); JSONObject object = null ;
try {
JSONObject memberObject = new JSONObject(memberStr);
object = new JSONObject(accountStr);
object.put( "member" , memberObject);
} catch (JSONException e) {
e.printStackTrace();
} Log.i( "" , object.toString());
|
输出的log
六、解析对象嵌套对象的json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Account account5 = gson.fromJson(object.toString(), Account. class );
Log.i( "解析对象嵌套对象的json" , account5.toString());
// 这里用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());
} |
输出的结果
7、另外一种解析对象嵌套对象的json
定义一个类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public class AccountObject {
private String id;
private String password;
private String name;
private String createDate;
private MemberObject memberObject = new MemberObject();
public class MemberObject {
private String id;
private String name;
@Override
public String toString() {
return "MemberObject [id=" + id + ", name=" + name+ "]\n\n" ;
}
}
@Override
public String toString() {
return "AccountObject [id=" + id + ", password=" + password + ", name=" + name + ", createDate=" + createDate + "," + memberObject.toString() + "]\n\n" ;
}
} |
生成json并解析
1
2
3
4
5
6
7
8
9
|
try {
JSONObject mObject = new JSONObject(memberStr);
object = new JSONObject(accountStr);
object.put( "memberObject" , mObject);
} catch (JSONException e) {
e.printStackTrace();
} AccountObject accountObject = gson.fromJson(object.toString(), AccountObject. class );
Log.i( "accountObject" , accountObject.toString());
|
打印出来的log
本文博客原创地址:http://www.cnblogs.com/liqw/p/4266209.html
demo下载链接:http://files.cnblogs.com/files/liqw/LauncherActivity.zip