JSON(JavaScript Object Notation)是一种用于数据交换的轻量级格式。它基于 JavaScript 语言的一个子集(对象在 JavaScript 中的构建方式)。如stated in the MDN,有些 JavaScript 不是 JSON,有些 JSON 不是 JavaScript。
使用此功能的一个示例是 Web 服务响应。在“旧”时代,Web 服务使用 XML 作为回传数据的主要数据格式,但自从 JSON 出现(JSON 格式由 Douglas Crockford 在RFC 4627 中指定)首选格式,因为它更轻量级
您可以在官方JSON web site找到更多信息。
JSON 建立在两种结构之上:
- 名称/值对的集合。在各种语言中,这被实现为对象、记录、结构、字典、哈希表、键控列表或关联数组。
- 值的有序列表。在大多数语言中,这被实现为数组、向量、列表或序列。
JSON 结构
以下是 JSON 数据的示例:
{
"firstName": "John",
"lastName": "Smith",
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": 10021
},
"phoneNumbers": [
"212 555-1234",
"646 555-4567"
]
}
JavaScript 中的 JSON
JSON(在 Javascript 中)是一个字符串!
人们通常认为所有 Javascript 对象都是 JSON,而 JSON 是 Javascript 对象。这是不正确的。
在 Javascript 中var x = {x:y} 是不是 JSON,这是一个 Javascript 对象。两者不是一回事。 JSON 等价物(以 Javascript 语言表示)将是 var x = '{"x":"y"}'。 x 是 string 类型的对象,而不是它自己的对象。要将其转换为完全成熟的 Javascript 对象,您必须首先对其进行解析,var x = JSON.parse('{"x":"y"}');、x 现在是一个对象,但这不再是 JSON。
见Javascript object Vs JSON
在使用 JSON 和 JavaScript 时,您可能想使用 eval 函数来评估回调中返回的结果,但不建议这样做,因为有两个字符(U+2028 和 U+2029)有效在 JSON 中,而不是在 JavaScript 中(阅读更多here)。
因此,必须始终尝试使用 Crockford 的脚本,该脚本会在评估 JSON 之前检查其是否有效。找到脚本解释的链接here,这里是 js 文件的direct link。现在每个主流浏览器都有its own implementation。
如何使用 JSON 解析器的示例(使用上面代码 sn-p 中的 json):
//The callback function that will be executed once data is received from the server
var callback = function (result) {
var johnny = JSON.parse(result);
//Now, the variable 'johnny' is an object that contains all of the properties
//from the above code snippet (the json example)
alert(johnny.firstName + ' ' + johnny.lastName); //Will alert 'John Smith'
};
JSON 解析器还提供了另一种非常有用的方法,stringify。该方法接受一个 JavaScript 对象作为参数,并返回一个 JSON 格式的字符串。当您想要将数据发送回服务器时,这很有用:
var anObject = {name: "Andreas", surname : "Grech", age : 20};
var jsonFormat = JSON.stringify(anObject);
//The above method will output this: {"name":"Andreas","surname":"Grech","age":20}
以上两个方法(parse和stringify)还带了第二个参数,这个函数会在最终结果的每一层的每一个key和value都会被调用,每一个value都会被替换为您输入函数的结果。 (更多关于here)
顺便说一句,对于所有认为 JSON 仅适用于 JavaScript 的人,请查看 this post,它解释并确认了其他情况。
参考文献