JSON/zh CN: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: JSON/zh CN
| Old | New | Line | |
|---|---|---|---|
| 1 | + | ## 概述 | |
| 2 | + | ||
| 3 | + | [JSON](http://www.json.org/json-zh.html) (JavaScript Object Notation) 是种数据表现形式,它提供了简单的文本标准化数据交换格式。正如其名称所暗示的,它是基于JavaScript编程语言的一个子集,但它与语言无关,除了易于阅读和编写,更易于机器解析和生成。 | |
| 4 | + | ||
| 5 | + | 相对于[[XML/zh CN|XML]],它易于阅读。 | |
| 6 | + | ||
| 7 | + | ## JSON 对象 | |
| 8 | + | ||
| 9 | + | 一个JSON对象,无非是括在大括号内的用逗号分隔的键值(名称/值)对。 | |
| 10 | + | ||
| 11 | + | ``` javascript | |
| 12 | + | {"name1":value1, "name2":value2 ...} | |
| 13 | + | ``` | |
| 14 | + | ||
| 15 | + | 为了便于人们阅读和可视化,键值(名称/值)对经常垂直列出: | |
| 16 | + | ||
| 17 | + | ``` javascript | |
| 18 | + | { | |
| 19 | + | "name1": value1, | |
| 20 | + | "name2": value2 | |
| 21 | + | } | |
| 22 | + | ``` | |
| 23 | + | ||
| 24 | + | 键名(名称)应该使用双引号括起来,而值可以是下列任意一种形式: | |
| 25 | + | ||
| 26 | + | - 简单的字符串、数字、布尔值或空值(字符用双引号括起来):\ | |
| 27 | + | `{"id":1, "name":"John Doe", "married":false}` | |
| 28 | + | ||
| 29 | + | - 数组;括在方括号中,仍以逗号分隔的集合:\ | |
| 30 | + | `{"primeNumbers":[2, 3, 5, 7, 11, 13, 17], "oddNumbers":[1,3,5,7]}` | |
| 31 | + | ||
| 32 | + | - 对象,名称的集合,包含在大括号中:\ | |
| 33 | + | `{"address":{"street":"145 Koinange Street", "City":"Nairobi", "Country":"Kenya"}}` | |
| 34 | + | ||
| 35 | + | JSON对象可以任意嵌套,以创建更复杂的对象: | |
| 36 | + | ||
| 37 | + | ``` javascript | |
| 38 | + | {"user": | |
| 39 | + | { "userid": 1900, | |
| 40 | + | "username": "jsmith", | |
| 41 | + | "password": "secret", | |
| 42 | + | "groups": [ "admins", "users", "maintainers"] | |
| 43 | + | } | |
| 44 | + | } | |
| 45 | + | ``` | |
| 46 | + | ||
| 47 | + | ## 有效的JSON格式 | |
| 48 | + | ||
| 49 | + | 已定义的JSON语法(参看RFC 4627)中的介绍: | |
| 50 | + | ||
| 51 | + | - JSON对象封装在大括号内`{ }`。空对象可以表示为`{ }` | |
| 52 | + | - 数组封装在方括号内`[ ]`。空数组可以表示为 `[ ]` | |
| 53 | + | - 成员由一个键-值对代表 | |
| 54 | + | - 成员中的键名应该使用双引号括起来 | |
| 55 | + | - 每个成员都应该有一个对象结构中唯一的键 | |
| 56 | + | - 值如果是字符串,则表示括在双引号中 | |
| 57 | + | - 布尔值使用小写**true**或**false**表示 | |
| 58 | + | - 数字使用双精度浮点格式表示;支持科学记数法形式;数字前不应该有零 | |
| 59 | + | - "攻击(冲突)"(像单、双引号、大、中括号等)性质的字符必须使用反斜杠进行转义 | |
| 60 | + | - 空值由小写**null**表示 | |
| 61 | + | - 其它类型,如日期,(JSON)本身不支持,应该由解析器/客户端处理转换为字符串 | |
| 62 | + | - 对象或数组每个成员后面必须跟一个逗号,如果它不是最后一个的话 | |
| 63 | + | - 常见的JSON文件扩展名是**.json** | |
| 64 | + | - JSON文件的MIME类型为**application/json** | |
| 65 | + | ||
| 66 | + | ## 实现 | |
| 67 | + | ||
| 68 | + | JSON实现不是很严格,更多的要求客户端应用程序/解析器来执行JSON标准。像往常一样编写代码: | |
| 69 | + | ||
| 70 | + | - be liberal in what you accept (~~自由接受~~) | |
| 71 | + | - be strict (adhering to the standard) in what you send (~~发送时坚持标准~~) | |
| 72 | + | ||
| 73 | + | JSON有两个主要实现方式: | |
| 74 | + | ||
| 75 | + | ### 官方JSON语法规范 | |
| 76 | + | ||
| 77 | + | 此实现将严格遵守RFC4627以上规范,并且不允许出现偏差。 | |
| 78 | + | ||
| 79 | + | ### JavaScript语法 | |
| 80 | + | ||
| 81 | + | This implementation follows the implementation of the Javascript programming language and as such allows for a few deviations from the official specification. For example: | |
| 82 | + | ||
| 83 | + | (~~这个实现是Javascript编程语言的实现,因此允许与官方规范有偏差。例如:~~) | |
| 84 | + | ||
| 85 | + | 1. 允许未引用键名,如`{name: "John Doe" }` | |
| 86 | + | 2. 允许单、双引号引用键名,如 `{'name': "John Doe", "language":'Pascal'}` | |
| 87 | + | 3. 允许最后一个成员后,跟随数组或对象,如 `{"keywords":["if","begin","for",], "IDEs":["Lazarus","fpIDE","MSEide"],}` | |
| 88 | + | ||
| 89 | + | ## 参看 | |
| 90 | + | ||
| 91 | + | - [[fcl-json]] FreePascal 和 Lazarus 包实现JSON | |
| 92 | + | - [JSON官方网站](http://www.json.org) | |
| 93 | + | - [[Streaming JSON/de]] (未翻译的德语教程) | |
| 94 | + | ||
| 95 | + | --- | |
| 96 | + | *From the Free Pascal wiki, page "JSON/zh CN", as it stood on 2015-07-17 after a change by FTurtle, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* | |
| 97 | + | Category: JSON/zh CN | |
| 98 | + | Category: zh |
