12.3 JSON

    JSON表示JavaScript Object Notation(JavaScript对象符号)。虽然其最初旨在用于JavaScript,但是作为一种数据交换格式,它是语言无关的。另外,由于种种原因(其中之一就是其相对容易实现),许多Web服务都将它作为基于XML传输数据的其他格式的替代物。他比XML更加轻量级、更紧凑,并且更易于进行机器分析。

    Android在org.json程序包中绑定了一个JSON分析器。

    虽然介绍JSON数据的精确语法将会偏离本书的主题,但是下面将介绍JSON对象的一个原型化表示。

    {“result”:{"aname":"Value","anumber":1234,"aboolean":false}}

    在JSON表示中可以看到,整个表示由括号包围:“{”和“}”。对象的名称是第一个字符串,其位于引号中,随后是一个冒号,即“result”:。下一组括号表示作为对象一部分的所有数据。每段数据都已相似的方式标识,其中名称在引号中,后跟一个冒号,然后是实际的数据。字符串采用引号来注明;没有引号的数字只是一个数字;布尔值用true或false来表示;最后,数据数组将是一系列置于方括号“[”和“]”内的对象,对象之间以逗号分隔。

   下面是一个称为anarray的数组。

   {“anarray”:[{"arrayelement":"Array Element 1"},{"arrayelement":"Array Element 2"}]}

    这个数组有两个元素,每个元素是一个对象,其以“{”和“}”围绕,并且对象之间以逗号分隔,每个对象都包含称为“arrayelement”的字符串。

    接下来看看如何使用Android内置的JSON分析器来分析JSON数据。

    首先将使用下面这个简单的JSON数据:

    {“result”:{"aname":"Value","anumber":1234,"aboolean":false},“anarray”:[{"arrayelement":"Array Element 1"},{"arrayelement":"Array Element 2"}]}

    为了使用JSON分析器,该数据必须位于一个字符串中。为此,必须对双引号进行转义。

1         String JSONData=""+"{\"results\":{\"aname\":\"value\",\"anumber\":1234,\"aboolean\":false, "+"\"anarray\":[{\"arrayelement\":\"Array Element 1\"},{\"arrayelement\":\"Array Element 2\"}]}}";

     在Android可用的JSON程序包中包含一个JSONObject类,可以通过传入JSON格式的数据(如在JSONData字符串中存在的数据)来构造它。

1             JSONObject overallJSONObject=new JSONObject(JSONData);

    一旦获得JSONObject,就可以提出任何JSON对象、JSON数组或者它可能包含的常规字段。由于结果是JSON对象,而且其正好位于外部对象的内部,因此可以通过使用getJSONObject方法并传入正试图提取的对象名称来获得它的引用。

1             JSONObject resultsObject=overallJSONObject.getJSONObject("results");

    一旦获得了该JSONObject对象,就能提取它所包含的任何数据。对每种数组类型都有不同的提取方法。

    为了提取一个字符串,可以使用getString方法,同时传入在JSON数据中指定的名称。

1             String aname=resultsObject.getString("aname");

    为了提取一个整数,可以使用getInt方法,同时传入在JSON数据中指定的名称。相应的,可以使用getDouble方法将JSON数据作为双精度数提取出来;或者通过使用getLong方法将它作为长整数提取出来。

1             int anumber=resultsObject.getInt("anumber");

    为了提取一个布尔值,可以使用getBoolean方法,同时传入在JSON数据中指定的名称。

1             boolean aboolean=resultsObject.getBoolean("aboolean");

    以上示例数据在resultsObject中还有一个JSON对象数组,称为anarray。可以使用getJSONArray方法并传入数组的名称来得到该数组的一个引用。

1             JSONArray anarray=resultsObject.getJSONArray("anarray");

    可以通过使用JSONArray上的getJSONObject方法并传入元素的索引号来遍历JSONArray对象,提取出其中单个的JSON对象元素。

1             for(int i=0;i<anarray.length();i++){
2                 JSONObject arrayElementObject=anarray.getJSONObject(i);
3                 String arrayelement=arrayElementObject.getString("arrayelement");
4             }

    下面是将上述所有内容汇总在一起的完整示例。

 1 package com.nthm.androidtestActivity;
 2 
 3 import org.json.JSONArray;
 4 import org.json.JSONException;
 5 import org.json.JSONObject;
 6 import android.app.Activity;
 7 import android.os.Bundle;
 8 
 9 public class SimpleJSON extends Activity {
10 
11     @Override
12     protected void onCreate(Bundle savedInstanceState) {
13         super.onCreate(savedInstanceState);
14         String JSONData=""+"{\"results\":{\"aname\":\"value\",\"anumber\":1234,\"aboolean\":false, "+"\"anarray\":[{\"arrayelement\":\"Array Element 1\"},{\"arrayelement\":\"Array Element 2\"}]}}";

    需要在try/catch块中包装许多JSONObject与JSONArray方法,因为他们中的许多方法都会抛出异常,其中包括JSONObject与JSONArray的构造函数。

 1         try{
 2             JSONObject overallJSONObject=new JSONObject(JSONData);
 3             JSONObject resultsObject=overallJSONObject.getJSONObject("results");
 4             String aname=resultsObject.getString("aname");
 5             int anumber=resultsObject.getInt("anumber");
 6             boolean aboolean=resultsObject.getBoolean("aboolean");
 7             JSONArray anarray=resultsObject.getJSONArray("anarray");
 8             for(int i=0;i<anarray.length();i++){
 9                 JSONObject arrayElementObject=anarray.getJSONObject(i);
10                 String arrayelement=arrayElementObject.getString("arrayelement");
11             }
12         }catch(JSONException e){

    大多数捕获的异常是JSONException示例,其表明在分析时发生了错误。在这里仅仅是输出栈跟踪。在你的应用程序中,你可能会想做某些更灵活的处理,如向用户显示错误消息或试图去掉生成错误的步骤以继续分析。

1             e.printStackTrace();
2         }
3     }
4 }

    如前所示,分析JSON数据的基础非常简单。接下来将在一个实际的示例中探讨如何将针对JSON数据的HTTP请求汇总在一起。

posted on 2014-09-09 16:01  宁静致远,一览众山小  阅读(191)  评论(0编辑  收藏  举报

导航