转自: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
new
ArrayList
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
new
ArrayList
for
(
int
i=
0
;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
Log.i(
"accountArrays"
,accountArrays[i].toString());
}
// 转化为List
List
|
更快捷地解析成List
1
2
3
4
|
// 更快捷地解析成List
Type listType =
new
TypeToken
ArrayList
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