【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,敬请期待。

时间: 2024-08-05 11:52:16

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

JSON数据格式介绍

JSON定义     JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,同一时候也易于机器解析和生成.它基于ECMA262语言规范(1999-12第三版)中JavaScript编程语言的一个子集. JSON採用与编程语言无关的文本格式,可是也使用了类C语言(包含C, C++, C#, Java, JavaScript, Perl, Python等)的习惯,这些特性使JSON成为理想的数据交换格式. JSON的结构基于以下两点 1. "名

JSON 数据格式,能比较清晰容易理解的解读json

JSON 数据格式(原文网址) JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成. 基础结构 JSON建构于两种结构: 1. “名称/值”对的集合(A collection of name/value pairs).不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary

【Android开发经验】FaceBook推出的Android图片加载库-Fresco

欢迎关注ndroid-tech-frontier开源项目,定期翻译国外Android优质的技术.开源库.软件架构设计.测试等文章 原文链接:Introducing Fresco: A new image library for Android 译者 : ZhaoKaiQiang 校对者: Chaossss 校对者: bboyfeiyu 校对者: BillionWang 状态 : 完成 在Android设备上面,快速高效的显示图片是极为重要的.过去的几年里,我们在如何高效的存储图像这方面遇到了很多

Android相关属性的介绍:android:exported = true

在Activity中该属性用来标示:当前Activity是否可以被另一个Application的组件启动:true允许被启动:false不允许被启动. android:exported 是Android中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性. 总体来说它的主要作用是:是否支持其它应用调用当前组件. 例如: <activity android:exported="true" …/> 注意: Android

json数据格式了解

json数据格式介绍: https://en.wikipedia.org/wiki/JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式 json语法是JavaScript对象表示法语法的子集: 键值对 逗号分隔 花括号保存对象 方括号数据 json的键(字段名)是字符串(双引号) json的值可以是数字, 字符串, 逻辑值(true, false), 数组(方括号), 对象(花括号嵌套), null json文件类型: ".json"

【Android开发经验】超好用的json解析工具——Gson项目使用介绍

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在上一篇文章中,我们简单的介绍了json数据格式,并介绍了如何使用Android自带的json工具,完成json数据的生成与解析.但是就像我所说的,自带的工具类太难用了!因此这篇文章,会介绍一个json解析的非常好的工具,那就是google的开源项目Gson. 咱们这次不介绍Gson里面的常用类了,因为常用的几个类非常的简单,我们直接上手开始用,看看Gson是多么的强大! 当然,如果使用第三方的项目,我们

【Android开发经验】比Gson解析速度快10倍!——Json解析神器Jackson使用介绍

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在前面的两篇文章中,我们介绍了Json数据格式和系统自带Json以及Google的Gson项目,如果能学会这些东西,基本能满足工作需求了.但是,程序员都有追求极致效率的嗜好,在满足了基本需求之后,我们会考虑能不能再优化一下效率呢?当然!今天这篇文章要介绍的,就是在数据量比较大的时候,比Gson的解析效率高近10倍的Json数据解析框架- -Jackson! 下面是一个大神关于几个常见的Json数据的解析速

android JSON数据格式 解析

一.   JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. Json建构于两种结构:  最后再加一种格式在文章的最后显示出来非常少有的格式 1."名称/值"对的集合(A collection of name/value pairs).不同的语言中.它被理解为对象(object).纪录(record).结构(struct),字典(dictionary),哈希表(hash table).有键列表(keyed list),或者关联数组 (

android 解析json数据格式(转)

json数据格式解析我自己分为两种: 一种是普通的,一种是带有数组形式的: 普通形式的:服务器端返回的json数据格式如下: {"userbean":{"Uid":"100196","Showname":"\u75af\u72c2\u7684\u7334\u5b50","Avtar":null,"State":1}} 分析代码如下: // TODO 状态处理 500