Android随手笔记44之JSON数据解析

时间:2022-04-23 06:06:19

json(javascript object notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为web应用开发提供了一种理想的数据交换格式。

  本文将主要介绍在android开发中,如何在服务器端创建json数据,以及如何在android客户端对json数据进行解析。

1.json数据结构

  在json中有两种数据结构:对象和数组。

1.1对象

  在json中,一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号),冒号后是该名称的值,多个“名称:值”之间使用 “,”(逗号)分隔开来。名称需要使用双引号括起来,值如果是字符串则必须用双引号括起来,如果是数值型则不需要。其结构示意图如图1所示。 

Android随手笔记44之JSON数据解析

图1 json对象结构示意图

  如下的代码是一个简单的json对象示例:

?
1
2
3
4
5
{
"id":,
"name":"jack",
"age":
}

1.2数组

  在json中,数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用 “,”(逗号)分隔开来。其结构示意图如图2所示。

 Android随手笔记44之JSON数据解析

图2 json数组结构示意图

  如下的代码是一个简单的json数组示例:

  ["北京","上海","广州"]

1.3值的类型

  在json的对象和数组结构中,value值不仅可以是数字、字符串等简单数据类型,还可以是对象、数组等,如图3所示。

Android随手笔记44之JSON数据解析

图3 json中值的类型

  因此,我们可以使用对象和数组的组合构成复杂的数据结构。如下的代码使用对象结构定义了一个“students”对象,在“students”对象中包含了一个学生数组,而学生数组中的值又是json对象。

?
1
2
3
4
5
6
7
{
  "students":
  [
  {"name":"jack","age":},
  {"name":"rose","age":}
  ]
}

2.在服务器端生成json数据

  通常,客户端在请求服务器数据时,服务器可以使用xml文档、json数据或html的形式将数据发送给客户端。

  那么如何在服务器端生成json数据呢?首先需要完成以下两个准备工作。

  (1)我们需要使用myeclipse创建了一个web project,这里我将该工程命名为了“jsondemoproject”,用来模拟服务器端的web服务。

  (2)我们还需要在该工程中导入json的api数据包json-lib-2.2.2-jdk15.jar。

  在json的api中,提供了jsonobject类,通过调用jsonobject类的put(object key, object value)方法,可以将一个object对象以键值对的形式存入jsonobject对象。通过调用jsonobject类的tostring()方法,则可以将jsonobject对象转化为json数据。

  如下的代码创建了一个jsontools类,并实现了静态方法createjsonstring(),用来生成json数据。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class jsontools {
    /*
     * function :  生成json数据
     * param   :  key    json数据的键值
     *       object   要生成json数据的内容
     * retuen  :  json数据
     * author  :  博客园-依旧淡然
     */
    public static string createjsonstring(string key, object value) {
      jsonobject jsonobject = new jsonobject();  //创建一个jsonobject对象
      jsonobject.put(key, value);         //往jsonobject对象中填入内容
      return jsonobject.tostring();        //生成json数据并返回
    }  
  }

  通过使用该方法,我们可以很方便的将各种数据传递进来,并将其转化成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;
  }

  其中,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");  //获取url参数
    if(action_flag.equals("persons")) {
      str = jsontools.createjsonstring("persons", listperson);
    }
    out.println(str);
    out.flush();
    out.close();
  }

  可以看到,在dopost()方法中,我们通过调用getlistperson()方法获得了person对象列表listperson,并将其传入jsontools.createjsonstring()方法中,从而获得了一串json数据。

  将该工程发布到tomcat上,使用浏览器访问该web工程,可以看到如图4所示的界面,person对象列表被成功的转化成了json数据。

 Android随手笔记44之JSON数据解析

图4 生成的json数据

3.在客户端解析json数据

  通过上面的步骤,我们已经在服务器上生成了json数据。要在我们的android工程中获取该json数据是很容易的,只需要利用android为我们提供的httpurlconnection接口访问图4所示的url即可。

  那么,获取到服务器上的json数据以后,如何在android工程中完成对该json数据的解析呢?

  观察图4所示的json数据可以看出:

  (1)该json数据的最外层是jsonobject,jsonobject的键是“persons”,值是一个jsonarray。

  (2)在jsonarray中又包含了3个jsonobject对象。

  (3)而在内嵌的每一个jsonobject对象中,都有3个键值对的组合。

  分析清楚了json数据的构成形式之后,就可以开始着手对其进行解析了。在android工程中,我们可以创建一个jsontools类,并实现getlistperson()类方法,用来完成把从服务器获得的json数据解析出来,还原成person对象列表。具体

代码如下所示:

?
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
/*
  * function :  解析json数据,还原成person对象列表
  * param   :  key      json数据的键值
  *        jsonstring   从服务器获得的json数据
  * retuen  :  person对象列表
  * author  :  博客园-依旧淡然
  */
 public static list<person> getlistperson(string key, string jsonstring) {
   list<person> list = new arraylist<person>();
   try {
     jsonobject jsonobject = new jsonobject(jsonstring);     //创建jsonobject对象
     jsonarray personarray = jsonobject.getjsonarray(key);    //获取jsonobject对象的值,该值是一个json数组
     for(int i = ; i < personarray.length(); i++) {
       jsonobject personobject = personarray.getjsonobject(i); //获得json数组中的每一个jsonobject对象
       person person = new person();
       int id = personobject.getint("id");           //获得每一个jsonobject对象中的键所对应的值
       string name = personobject.getstring("name");
       int age = personobject.getint("age");
       person.setid(id);    //将解析出来的属性值存入person对象
       person.setname(name);
       person.setage(age);
       list.add(person);    //将解析出来的每一个person对象添加到list中
     }
   } catch (jsonexception e) {
     e.printstacktrace();
   }
   return list;
 }

  在本实例中,点击button按钮向服务器发送获取json数据的请求,从服务器获得json数据后,可以使用以上的代码完成对json数据的解析,最后将解析得到的person对象依次显示在textview控件中。程序运行的结果如图5所示。

Android随手笔记44之JSON数据解析

图5 运行结果

以上内容是小编给大家分享的android随手笔记44之json数据解析的全部叙述,希望大家喜欢。