JSON——轻量级的数据交换格式(理论与 .Net 实践)
本文内容
- JSON 概述
- JSON 结构
- JSON 格式
- 简单表示字符串、数字、布尔型和 null
- 数组字面量——用 JSON 表示数组
- 对象字面量——用 JSON 表示对象
- 混合字面量
- JSON 的编码与解码
JSON 概述
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和书写。易于机器解析和生成。对程序员来说,与使用约定的语言相比,如C语言家族的,C,C + +,C#,Java,JavaScript,Perl,Python 等,JSON 是一种纯文本格式、完全独立的语言。这使得 JSON 成为理想的数据交换语言。
JSON 的产生有其必然性。因为 JavaScript 中操作 XML 存在严重的跨浏览器问题,而且从 XML 结构提取数据也要涉及遍历 DOM 文档,而这些操作都需要编写大量代码。所以,JavaScript 开发人员很多快就对 XML 失去了兴趣。Douglas Crockford 发明了 JSON,用以避免使用 XML 数据的麻烦。
JSON 的基础是 JavaScript 语法中的一个子集,特别是对象和数组字面量。使用 JSON 能够创建与 XML 相同的数据结构。与 XML 文件相比,JSON 更简单。而且对其访问无需进行额外的解析。
使用 JSON,很重要的一点是理解 JavaScript 中数组和对象字面含义的特殊标识法。也就是说,仅仅用简单的字符串来表示一个数组,或是对象。
另外,JSON 语法除了仅仅用来存储数据。JSON 只表示数据,它没有变量、赋值、等值判断等概念。
JONS 结构
JSON 建立在两个结构上:
- 名称/值对的集合。在不同的编程语言中,这是作为 object、record、struct、dictionary、hash table、keyed list 或 associative array 来实现的。
- 值的有序列表。在大多数语言中,这是作为 array、vector、list 或 sequence 来实现的。
这些都是通用的数据结构。事实上,几乎所有的现代编程语言都在某种形式上支持它们。意义在于,一种数据格式可以与基于其他数据结构的编程语言交互。
也就是说,JSON 的结构,在几乎所有的编程语言中都以某种方式得到实现,比如,对象,记录,字典,hash表,或是数值,向量等,无论是在 .Net,还是 Java,都有相应的数据结构,那么我们可以将这些结构生成一个通用的纯文本格式,以便在不同系统之间交互数据。
总体上,JSON 采用如下形式。
图1 JSON 格式
如图 1 所示,JSON 规定了一个字符串、数字、对象、数组,以及 true、false 和 null 的格式。也就是说,一个值可以是一个用双引号括起来的字符串,或是一个数字、true、false、null(不带双引号),或是一个对象、数组。
这个结构可以嵌套。一个对象的属性,当然可以是字符串、数字、数组等,也可以是另一个对象……一个数组当然可以有字符串、布尔,或是一个对象……
JSON 格式
简单表示字符串(String)、数字(Number)、布尔型(bool)和 null
字符串、数字 和布尔用 JSON 表示非常简单。
例如,用 JSON 表示一个简单的 String “abc”,其格式为:"abc"。一个字符串是一个包裹在双引号里零个或多个 Unicode 字符序列。使用反斜杠转义。一个字符表示为一个字符的字符串。这个字符串就像 C 或 Java 语言中的字符串。
图3 用 JSON 表示 数字
一个数字非常像 C 或 Java 语言中的数值,除了八进制和十六进制格式以外。
除了字符 ",\,/ 和一些控制符(\b,\f,\n,\r,\t)需要编码外,其他 Unicode 字符可以直接输出。布尔型表示为 true 或 false 。此外,JavaScript 中的 null 被表示为 null,注意:true、false 和 null 都没有双引号,否则将被视为一个 String。
空格可以插入到任何标记之间。
示例:
若定义如下变量:
string myString1 = "City is Beijing";
string myString2 = "City is \'Beijing\'";
int myNumber = 100;
bool myBool1 = false;
bool myBool2 = true;
string myNull = null;
那么序列化后,用 JSON 表示如下:
"City is Beijing"
"City is 'Beijing'"
100
false
true
null
在简单表示的基础上,我们可以进一步规定对象、数组的格式,以及它们的混合格式。
数组字面量——用 JSON 表示数组
一个数组是值的有序集合。一个数组以“[”开始,以“]”结束,值用“,”分隔。
图4 用 JSON 表示数组
示例:
若创建一个 ArrayList 对象,如下所示:
ArrayList array = new ArrayList();
array.Add("Beijing");
array.Add("Chaoyang Road");
array.Add(100025);
那么序列化后,用 JSON 表示如下:
["Beijing", "Chaoyang Road", 100025]
对象字面量——用 JSON 表示对象
一个对象是一个名称/值对的无序集合。对象以“{”开始,以“}”结束。每个名称后跟“:”,名称/值对通过“,”分隔。
图5 用 JOSN 表示对象
示例:
若定义创建一个 Address 类,如下所示。
public class Address
{
public string city { get; set; }
public string street { get; set; }
public int postcode { get; set; }
}
Address address = new Address();
address.city = "Beijing";
address.street = "Chaoyang Road";
address.postcode = 100025;
那么序列化后,用 JSON 表示如下:
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
混合字面量
值(图5中 value)也可以是另一个 Object 或者数组,因此,Object 可以嵌套表示,例如,在上一小节基础上,一个 Person 对象包含 name 和 address 对象,可以表示如下:
{
"name": "Michael",
"address":
{
"city": "Beijing",
"street": " Chaoyang Road ",
"postcode": 100025
}
}
JSON 的编码和解码
JSON 的编码和解码,客户端和服务器的工具都有,必须有。比如,用 JavaScript 实现的程序库,用 C#/.NET、Java、PHP、Perl、Python 等。
- Json.js www.json.org/json.js
- Json.Net www.newtonsoft.com/product/json
- ColdFusion http://jehiah.com/projects/cfjson
- Java/JSP www.crockford.com/JSON/java
- PHP-json www.aurore.net/projects/php-json/
- json-py(Python) https://sourceforge.net/projects/json-py/
参考
JSON.org http://www.json.org/
IBM JSON https://www.ibm.com/developerworks/cn/web/wa-lo-json/