json即javascript object natation, 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为web应用开发提供了一种理想的数据交换格式。
json对象:
json中对象(object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, key-value对之间使用逗号分隔. 如:{"name":"coolxing", "age"=24, "male":true, "address":{"street":"huilongguan", "city":"beijing", "country":"china"}}. json对象的key只能是string类型的, 而value可以是string, number, false, true, null, object对象甚至是array数组, 也就是说可以存在嵌套的情况.
json数组:
json数组(array)以"["开始, 以"]"结束, 数组中的每一个元素可以是string, number, false, true, null, object对象甚至是array数组, 数组间的元素使用逗号分隔. 如["coolxing", 24, {"street":"huilongguan", "city":"beijing", "country":"china"}].
在上一篇博文《android学习笔记44:json数据解析》中,我们使用基本的json api完成了在服务器端创建json数据,以及在android客户端对json数据进行解析。
其实,要创建和解析json数据,也可以使用gson来完成。gson是google提供的用来在java对象和json数据之间进行映射的java类库。使用gson,可以很容易的将一串json数据转换为一个java对象,或是将一个java对象转换为相应的json数据。
1.gson的两个重要方法
在gson的api中,提供了两个重要的方法:tojson()和fromjson()方法。其中,tojson()方法用来实现将java对象转换为相应的json数据,fromjson()方法则用来实现将json数据转换为相应的java对象。
1.1 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数据。
1.2 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对象。
2.在服务器端生成json数据
要使用gson技术在服务器端生成json数据,首先需要完成以下两个准备工作。
(1)使用myeclipse创建了一个web project,这里我将该工程命名为了“gsondemoproject”,用来模拟服务器端的web服务。
(2)往该工程中导入gson的api数据包gson-2.2.1.jar。
然后,我们便可以在该工程中创建一个jsontools工具类,并实现静态方法createjsonstring(),在该方法中通过使用gson技术来生成json数据。该方法的具体实现如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class jsontools {
/*
* function : 生成json字符串
* param : value 想要转换成json字符串的object对象
* retuen : json字符串
* author : 博客园-依旧淡然
*/
public static string createjsonstring(object value) {
gson gson = new gson();
string string = gson.tojson(value);
return string;
}
}
|
可以看到,这个方法的具体实现非常简单,首先创建一个gson对象,然后通过调用gson对象的tojson()方法,将传进来的value(任意的java对象)转换成json字符串即可。
通过使用该方法,我们可以很方便的将任意java对象传递进来,并将其转化成json数据。和上一篇博文中一样,我们可以在jsonservice类中,实现一个简单的获取person对象列表的方法,具体如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/*
* function : 获取person对象列表
* author : 博客园-依旧淡然
*/
public list<person> getlistperson() {
list<person> list = new arraylist<person>();
person person = new person(, "jack" , );
person person = new person(, "rose" , );
person person = new person(, "bob" , );
list.add(person);
list.add(person);
list.add(person);
return list;
}
|
在该方法中,我们向list列表中加入了3个person对象,每个person对象具有id(int)、name(string)和age(int)三个属性。
最后,我们还需要创建一个继承自httpservlet的jsonaction类,并实现其中的dopost()方法,用来响应客户端对服务器的请求。具体如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public void dopost(httpservletrequest request, httpservletresponse response)
throws servletexception, ioexception {
response.setcontenttype( "text/html;charset=utf-" );
request.setcharacterencoding( "utf-" );
response.setcharacterencoding( "utf-" );
printwriter out = response.getwriter();
list<person> listperson = jsonservice.getlistperson();
string str = null ;
string action_flag = request.getparameter( "action_flag" );
if (action_flag.equals( "persons" ) {
str = jsontools.createjsonstring(listperson);
}
out.println(str);
out.flush();
out.close();
}
|
在该方法中,我们通过调用jsonservice类中的getlistperson()方法获得了person对象列表listperson,并将其传入jsontools.createjsonstring()方法中,生成了person对象列表的json数据。将该工程发布到tomcat上,使用浏览器访问该web工程,可以看到如图1所示的界面,person对象列表被成功的转化成了json数据。
图1 生成的json数据
3.在客户端解析json数据
在android工程中,我们可以通过httpurlconnection接口访问图1所示的url来获得服务器上的json数据。
得到json数据之后,便可以通过使用前面提到的fromjson()方法,将图1 所示的json数据还原成对应的person对象列表了。当然了,因为这里使用到了gson,同样需要向android工程中导入gson-2.2.1.jar包。具体的实现方法如下。
1
2
3
4
5
6
7
8
9
10
11
12
|
/*
* function : 解析json数据,还原成person对象列表
* param : jsonstring 从服务器获得的json数据
* retuen : person对象列表
* author : 博客园-依旧淡然
*/
public static list<person> getlistperson(string jsonstring) {
list<person> list = new arraylist<person>();
gson gson = new gson();
list = gson.fromjson(jsonstring, new typetoken<list<person>>(){}.gettype());
return list;
}
|
可以看到,使用gson解析json数据的代码实现也非常简单。其中,typetoken是gson提供的数据类型转换器,支持多种数据集合类型转换,其反射机制可以实现将解析出来的java对象映射到对应的数据集合中。
在本实例中,同样点击button按钮向服务器发送获取json数据的请求,从服务器获得json数据后,使用以上的代码完成对json数据的解析,最后将解析得到的person对象依次显示在textview控件中。程序运行的结果如图2所示。
图2 运行结果
以上内容是小编给大家分享的android学习笔记45之gson解析json的全部叙述,希望大家喜欢。