本文旨在短时间内让读者简单的认识 JSON

JSON 简介

JSON,即 JavaScript Object Notation 的缩写,指的是 JavaScript 的对象表示法,虽然 JSON 使用 JS 语法来描述数据对象,但其本身独立于语言和平台,JSON 的解析器和库都支持不同的编程语言。

与 XML(可扩展标记语言)类似的是,JSON 是纯文本;具有自我描述性,即我们可以简单的理解它;具有层级结构。

JSON 语法

JSON 数据的书写格式是名称/值对,其中包括双引号中的字段名称,后面写一个冒号,然后是值,值可以是整数或浮点数、双引号中的字符串、true or false、方括号中的数组、花括号中的对象;null。例如下面这条

"JSON":"helloworld"

这条语句等价于

JSON = "helloworld"

 

JSON 对象在花括号中书写,其中可以包含多个名称/值对,比如下面这条

{
  "JS":"hello",
  "ON":"world"
}

等价于

JS ="hello", ON ="world"

 

JSON 数组在方括号中书写,其中可以包含多个对象,

{
 "JP":[
    {"JS":"hell", "ON":"wrld"},
    {"JS":"helo", "ON":"wold"},
    {"JS":"hllo", "ON":"word"}
  ]
}

因为 JSON 使用的是 JavaScript 的语法,所以无需额外的软件就能处理JS 中的 JSON,比如这样

var JP = [
  {"JS":"hell", "ON":"wrld"},
  {"JS":"helo", "ON":"wold"},
  {"JS":"hllo", "ON":"word"}
];

如果要访问对象数组,可以像这样进行访问

JP[0].JS

返回的内容是

hell

JavaScript 处理 JSON 数据

JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据,将 JSON 数据转换为 JavaScript 对象,然后在网页中使用该数据。接下来,我们来讨论 JavaScript 如何处理 JSON 数据。

在 web 页面中用 JavaScript 处理 JSON 数据时,

function handleJson() {
 var Message={"name":"Michael","address":
     {"city":"Beijing","street":"Chaoyang Road","postcode":100025}
 };
 document.write(Message.name);
 document.write(Message.address.city);
}

假定服务器返回的 JSON 数据是上文的:

{
  "name":"Michael",
  "address":{
    "city":"Beijing",
    "street":" Chaoyang Road ",
    "postcode":100025
  }
}

只需将其赋值给一个 JavaScript 变量(例如上文中的 Message),就可以立刻使用该变量并更新页面中的信息了。

这相比起 XML 就显得更加的容易。我们要做的仅仅是将服务器返回的JSON 数据赋给一个 JavaScript 变量即可。

JSON 的数据可移植性问题

JSON 允许 Unicode 行结束符 U + 2028(行分隔符)和 U + 2029(段落分隔符)在引用字符串中显示为非转义,而 JavaScript 不显示。这是JSON 只禁止"控制字符"的结果。为了最大限度地提高可移植性,这些字符应该反斜杠转义。生成 JSONP 时,这个微妙之处非常重要。

更多关于 U+2028/2029 的讨论:

https://github.com/rack/rack-contrib/pull/37

JSON 文档可以用 UTF-8,UTF-16 或 UTF-32 编码,默认编码为 UTF-8(I-JSON 仅支持 UTF-8)。这些编码支持完整的 Unicode 字符集,包括基本多语言面以外的字符(U + 10000至U + 10FFFF)。但是,如果转义,那么这些字符必须使用 UTF-16 代理对(一些 JSON 解析器遗漏的细节)编写。例如,在 JSON 中包含表情符号字符U + 1F602 ?(喜极而泣):

{  "face" : "?"  }

//或

{  "face" : "\uD83D\uDE02"  }

JSON 中的数字在编程语言中的表示是不可知的。整数和浮点值之间没有区分太清楚:一些可能把42,42.0以及4.2E+1当成是一样的,而其他的可能不会。对于溢出,下溢,精度损失或舍入等问题没有要求。另外,JSON 没有提及有符号零的处理:0.0是否不同于-0.0。使用 IEEE 754浮点标准(包括 JavaScript)的大多数实现都保留带符号的零; 但并不是所有的 JSON 实现都可以这样做。