Android 利用Gson生成或解析json

本文介绍如何使用Java生成和解析JSON对象、数组及嵌套结构,包括单个对象、对象数组和对象嵌套。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、单个对象生成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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值