Android学习笔记45之gson解析json

时间:2022-03-21 06:44:59

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数据。

Android学习笔记45之gson解析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所示。

 Android学习笔记45之gson解析json

图2 运行结果

以上内容是小编给大家分享的android学习笔记45之gson解析json的全部叙述,希望大家喜欢。