【Android开发经验】Json数据格式介绍、使用Android自带类库完成Json生成与解析

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992

    因为在之前的项目中,xml和json数据格式都有使用过,所以对json格式的简单、高效的特点印象深刻。如果使用json语言进行开发,强烈推荐使用json数据格式!

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。  JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。


    JSON建构于两种结构:
    (1)“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
    (2)值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
    

    因为这种数据结构在大部分现代计算机语言都以某种形式存在。所以使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。比如给android和ios写api接口的时候,采用json格式就可以实现跨平台支持。


    1.键值对形式:

    这种方式我们可以对应java里的map结构。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

    下面是一个键值对形式的简单示例:

    {
        "name": "zhao",
        "age": 22,
        "address": "QingDao"
    }

    前面的键是String字符串,但是后面的值却可以是多种类型,比如字符串、bool、数值、null、对象甚至是数组。

    下面是一个值是对象的简单示例:

{
    "name": "zhao",
    "age": 22,
    "address": "QingDao",
    "birthday": {
        "year": 19,
        "month": 1,
        "day": 19
    }
}

    我们可以使用下面的图表示这种形式



    2.数组形式

    数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

    对应于java里面的类,我们可以认为这是一个可以放object的数组,值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。

    下面是一个使用数组形式的示例:

[
    "zhaokaiqiang",
    22,
    "QingDao",
    {
        "year": 1992,
        "month": 1,
        "day": 19
    },
    true,
    null
]

    我们可以使用下面的这个图表示这种形式



    value的取值可以使用下面的图片表示



    如果在字符串里面有需要转义的字符的话,可以参考下面的关于转义的说明



    Json数据格式就这么点东西,非常的简单明了。Android里面自带的org.json包里面的类,可以生成Json格式的数据或者是对Json格式的数据进行解析。

    下面简单的介绍一下Android里面的json相关类的使用,但是强烈不推荐大家使用android自带的json相关类!

    和json相关的类就下面5个,下面分别介绍这几个类的用法



1.JSONObject

    这个类主要对json键值对形式的数据操作进行了封装,下面是常用的几个方法:

JSONObject.put(key,values);//添加,用于生成json

JSONObject.get(key);//获取,用于解析json

JSONObject.optXXX(key);//也是用于获取,在解析的时候会用到,但是不会抛出异常,而是返回默认的值

    如果我们要生成键值对形式的字符串,那么可以使用这个类,就像下面的代码

public void objectToJson() throws Exception {

		JSONObject jsonObject = new JSONObject();
		jsonObject.put("name", "zhaokaiqiang");
		jsonObject.put("age", 22);
		Log.d(TAG, jsonObject.toString());
	}

    结果如下:

{"age":22,"name":"zhaokaiqiang"}

    因为没有一个方法可以直接转换,所以只能这样自己设置key和value,很麻烦。


2.JSONArray

    这个类主要是对有序的数组形式的操作进行了封装。常用方法与JSONObject类似:

JSONArray.put(key,values);//添加,用于生成json

JSONArray.get(key);//获取,用于解析json

JSONArray.optXXX(key);//也是用于获取,在解析的时候会用到,但是不会抛出异常,而是返回默认的值

   下面是一个使用的小示例:

public void objectToJson() throws Exception {

		JSONArray jsonArray = new JSONArray();
		Person p = new Person("zhaokaiqiang", 22, new Birthday(1992, 1, 19));
		jsonArray.put("toJson");
		jsonArray.put(100);
		jsonArray.put(true);
		jsonArray.put(p);

		Log.d(TAG, jsonArray.toString());

	}

    下面是测试结果:

["toJson",100,true,"Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]]"]
    当我们在JSONArray里面添加对象的时候,其实是将对象的toString()方法的字符串插入了进去,这样对于我们反序列化,非常的不方便,这也是为什么我不推荐使用这个类的原因。


3.JSONStringer

    这个类是用来方便我们构建json格式的字符串的。下面是常用的方法:

JSONStringer.object();//开始构建一个键值对形式的json

JSONStringer.key(name);//添加一个key

JSONStringer.values(value);//添加value

JSONStringer.endObject();//结束键值对形式的json的构建

    当然,也可以构建数组形式的,都是一样的用法,不过多解释了,下面给出一个简单的示例

public void jsonStringerToJson() throws Exception {

		JSONStringer jsonStringer = new JSONStringer();

		jsonStringer.object();
		jsonStringer.key("name");
		jsonStringer.value("zhaokaiqiang");
		jsonStringer.key("age");
		jsonStringer.value(22);
		jsonStringer.key("birthday");
		jsonStringer.value(new Birthday(1992, 1, 19));
		jsonStringer.endObject();
		
		Log.d(TAG, jsonStringer.toString());
	}

    下面是输出结果

{"name":"zhaokaiqiang","age":22,"birthday":"Birthday [year=1992, month=1, day=19]"}

    如果想生成数组形式的json,只需要把object换成array即可。


4.JSONTokener

    这个类是用来对json文本进行解析的,功能比较弱。

    下面直接给处一个示例代码:

public void fromJson() throws Exception {

		JSONStringer jsonStringer = new JSONStringer();

		jsonStringer.object();
		jsonStringer.key("name");
		jsonStringer.value("zhaokaiqiang");
		jsonStringer.key("age");
		jsonStringer.value(22);
		jsonStringer.endObject();

		String jsonString = jsonStringer.toString();
		Log.d(TAG, "生成的json----------" + jsonString);

		JSONTokener jsonTokener = new JSONTokener(jsonString);
		JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();
		String name = jsonObject.getString("name");
		int age = jsonObject.getInt("age");
		Log.d(TAG, "name=" + name);
		Log.d(TAG, "age=" + age);
		
	}

    下面是输出结果

11-26 14:15:37.842: D/JsonTest(10053): 生成的json----------{"name":"zhaokaiqiang","age":22}
11-26 14:15:37.842: D/JsonTest(10053): name=zhaokaiqiang
11-26 14:15:37.842: D/JsonTest(10053): age=22

5.JSONException

    这个是我们解析过程中出现错误,比如说如果想下面这样,就会抛出异常

jsonObject.getString("age");

    因为"age"对应的字段是int类型,如果按照String读取,就会出现这种错误。


   最后要说的:因为Android自带的json相关的类功能太弱了,所以强烈不推荐使用!这些东西知道就可以,防止看其他人的代码碰到看不懂。下面的文章我会介绍更好用,更加高效的json数据格式的解析和生成,比如google的gson,敬请期待。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。