JSON

JSON
扩展名
.json
互联网媒体类型
application/json
类型代码英语Type codeTEXT
统一类型标识public.json
格式类型数据交换
扩展自JavaScript
标准RFC 7159, ECMA-404
网站json.org

JSON(JavaScript Object Notation, /ˈsən/)是由美國程式設計師道格拉斯·克羅克福特構想和設計的一種輕量級資料交換格式。其內容由屬性和值所組成,因此也有易於閱讀和處理的優勢。JSON是獨立於程式語言资料格式,其不僅是JavaScript的子集,也採用了C語言家族的習慣用法,目前也有許多程式語言都能夠將其解析和字串化,其廣泛使用的程度也使其成為通用的資料格式。

簡介

JSON格式是1999年《JavaScript Programming Language, Standard ECMA-262 3rd Edition》的子集合,所以可以在JavaScript以eval()函式(javascript通过eval()调用解析器)读入。不过这并不代表JSON无法使用于其他语言,事实上几乎所有与网络开发相关的语言都有JSON函式库。

JSON的基本数据类型:

  • 数值:十进制数,不能有前导0,可以为负数,可以有小数部分。还可以用e或者E表示指数部分。不能包含非数,如NaN。不区分整数与浮点数。JavaScript用双精度浮点数表示所有数值(后来也支持 BigInt[1])。
  • 字串:以双引号""括起来的零个或多个Unicode码位。支持反斜杠开始的转义字符序列
  • 布尔值:表示为true或者false
  • 陣列:有序的零个或者多个值。每个值可以为任意类型。数组使用方括号[]包裹。多个数组元素之间用逗号,分隔,形如:[value, value]
  • 物件:若干无序的“键-值对”(key-value pairs),其中键只能是字符串[2]。建议但不强制要求对象中的键是独一无二的。对象以花括号{}包裹。多个键-值对之间使用逗号,分隔。键与值之间用冒号:分隔。
  • 空值:值写为null

token(6种标点符号、字符串、数值、3种字面量)之间可以存在有限的空白符并被忽略。四个特定字符被认为是空白符:空格符水平制表符回车符换行符。空白符不能出现在token内部(但空格符可以出现在字符串内部)。JSON标准不允许有字节序掩码,不提供注释的句法。 一个有效的JSON文档的根节点必须是一个对象或一个数组。

JSON交换时必须编码为UTF-8[3]转义序列可以为:“\\”、“\"”、“\/”、“\b”、“\f”、“\n”、“\r”、“\t”,或Unicode16进制转义字符序列(\u后面跟随4位16进制数字)。对于不在基本多文種平面上的码位,必须用UTF-16代理对(surrogate pair)表示,例如对于Emoji字符——喜極而泣的表情(U+1F602 😂 FACE WITH TEARS OF JOY)在JSON中应表示为:

{ "face": "😂" }
// or
{ "face": "\uD83D\uDE02" }

JSON的格式描述可以參考RFC 4627。

历史

JSON 源于对实时服务器到浏览器会话通信协议的需求,无需使用 Flash 或 Java 小程序等浏览器插件,这是 2000 年代初期使用的主要方法。

Crockford 首先指定并普及了 JSON 格式。这个缩写词起源于 State Software,这是一家由 Crockford 和其他人于 2001 年 3 月共同创立的公司。联合创始人同意构建一个使用标准浏览器功能的系统,并为 Web 开发人员提供一个抽象层来创建有状态的 Web 应用程序,该应用程序具有 通过保持两个超文本传输协议 (HTTP) 连接打开并在标准浏览器超时之前(如果没有进一步交换数据)回收这些连接,实现与 Web 服务器的持久双工连接。 联合创始人进行了讨论,并投票决定将数据格式命名为 JSML(JavaScript 标记语言)还是 JSON(JavaScript 对象表示法),以及在何种许可类型下提供该格式。 JSON.org 网站于 2001 年推出。

JSON 库的前身被用于Cartoon Network的 Communities.com 上名为“Cartoon Orbit”的儿童数字资产交易游戏项目(State 联合创始人之前都曾在这家公司工作过),该项目 使用具有专有消息格式的浏览器端插件来操作 DHTML 元素(该系统也属于 3DO)。 在发现早期的 Ajax 功能后,digiGroups、Noosh 等公司使用框架将信息传递到用户浏览器的视野中,而无需刷新 Web 应用程序的视觉上下文,仅使用标准 HTTP、HTML 和 JavaScript 功能即可实现实时丰富的 Web 应用程序 Netscape 4.0.5+ 和 IE 5+。 Crockford 随后发现 JavaScript 可以用作此类系统的基于对象的消息传递格式。 该系统被出售给 Sun Microsystems、Amazon.com 和 EDS。

应用领域

Metadata和架构

JSON文本的官方媒体类型是双引号,这一点在大多数现代的安装中都采用了这种类型。由于传统原因,许多服务提供商、浏览器、服务器、Web 应用程序、库、框架和API也支持非官方的 MIME 类型 或内容类型。值得注意的例子包括谷歌搜索API,雅虎,脸书的API,Lift,和Dojo Toolkit。JSON 架构指定一种基于 JSON 的格式,用于定义用于验证、文档和交互控制的 JSON 数据的结构。它为给定应用程序所需的 JSON 数据以及如何修改该数据提供协定。JSON架构基于XML架构(XSD)中的概念,但基于JSON。与在 XSD 中一样,相同的序列化/反序列化工具可用于架构和数据,并且它是自描述的。它在IETF的互联网草案中指定,目前为2020-12年草案,于2021年1月28日发布。有几个验证器可用于不同的编程语言,每个验证器都有不同程度的一致性。标准文件扩展名为 .json。JSON 标准不支持对象引用,但存在基于 JSON 的对象引用的 IETF 草案标准。

WEB开发

JSON最开始被广泛的应用于WEB应用的开发。不過目前JSON使用在JavaScriptJavaNode.jsC#應用的情況比較多,PHP等開發的WEB應用主要還是使用XML

NoSQL数据库

相对于传统的关系型数据库,一些基于文档存储的NoSQL非关系型数据库选择JSON作为其数据存储格式,比较出名的产品有:MongoDBCouchDBRavenDB英语RavenDB等。

举例

{
     "firstName": "John",
     "lastName": "Smith",
     "sex": "male",
     "age": 25,
     "address": 
     {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": "10021"
     },
     "phoneNumber": 
     [
         {
           "type": "home",
           "number": "212 555-1234"
         },
         {
           "type": "fax",
           "number": "646 555-4567"
         }
     ]
 }

这种JSON格式也被不少游戏(如Minecraft)或應用軟體用来当作的部分数据存储的格式:

[
     {
          "text": "This is the text",
          "color": "dark_red",
          "bold": true,
          "strikethough": true,
          "clickEvent":
          {
               "action": "open_url",
               "value": "zh.wikipedia.org"
          },
          "hoverEvent":
          {
               "action": "show_text",
               "value":
               {
                    "text": "something"
               }
          }
     },
     {
          "translate": "item.dirt.name",
          "color": "blue",
          "bold": false,
          "italic": true
     }
]

互操作性

RFC 8259 (页面存档备份,存于互联网档案馆)描述了 JSON 语法的某些方面,尽管这些方面符合规范,但可能会导致互操作性问题。

  • 某些 JSON 实现仅接受表示对象或数组的 JSON 文本。为了实现互操作性,交换 JSON 的应用程序应传输对象或数组形式的消息。
  • 该规范允许 JSON 对象包含多个具有相同名称的成员。处理具有重复名称的对象的实现的行为是不可预测的。为了实现互操作性,应用程序在传输 JSON 对象时应避免重复名称。
  • 规范特别指出 JSON 对象中成员的顺序并不重要。为了实现互操作性,应用程序应该避免为成员排序赋予含义,即使解析软件使该排序可见。
  • 虽然规范对 JSON 数字文字的大小或精度没有限制,但广泛使用的 JavaScript 实现将它们存储为 IEEE754“binary64”数量。为了实现互操作性,应用程序应避免传输无法以这种方式表示的数字,例如 1E400 或 3.141592653589793238462643383279。
  • 虽然规范不限制 JSON 文本中 Unicode 字符的字符编码,但绝大多数实现都采用UTF-8编码;为了实现互操作性,应用程序应始终且仅使用 UTF-8 对 JSON 消息进行编码。
  • 该规范并不禁止传输不能正确表示 Unicode 字符的字节序列。为了实现互操作性,应用程序应传输不包含此类字节序列的消息。
  • 该规范不限制应用程序如何比较 Unicode 字符串。为了实现互操作性,应用程序应始终逐个代码单元执行此类比较。

2015 年,IETF 发布了RFC7493 (页面存档备份,存于互联网档案馆),描述了“I-JSON 消息格式”,这是 JSON 的受限配置文件,它限制了 JSON 的语法和处理,以尽可能避免这些互操作性问题

安全問題

读取JSON

由於JSON是JavaScript的子集,所以一般都會使用eval()作為讀取資料的方式,如果是针对可靠的数据来源,在不支持原生JSON解析的浏览器上面这是最快速的方法。然而由于eval方法同样可以执行任意的JavaScript代码,因此当数据来源不可靠时则可能产生安全问题。如下面的例子,直接用eval执行时会跳转:

var json= eval("{message:(function (){ window.location='http://zh.wikipedia.org/wiki/JSON#.E5.AE.89.E5.85.A8.E6.80.A7.E5.95.8F.E9.A1.8C'; })()}");

其中一種防止不安全程式碼出現的解決辦法,是通过浏览器原生支持的JSON.parse(str)方法讀取JSON資料,目前已经得到大部分主流浏览器的支持(IE8+,Firefox 3.5+,Chrome4+/Safari4+,Opera10+),在不支持原生JSON对象的浏览器上面可以使用parseJSON方法进行读取[4]parseJSON採用解析器驗證讀入的程式碼是否真的是JSON程式碼,這樣就更安全。但由於這是用模擬的方式讀取,速度上會比eval()慢。

跨站存取問題

另外一個安全上的問題則是跨站請求偽造(Cross-site request forgery,簡稱CSRF或XSRF)。這個問題在JavaScript中的狀況是,由於JavaScript採用了稱為「沙盒」的機制,這種機制限制JavaScript引擎僅能引入同一個站點的程式碼,因而某種程度上提高了安全性。

與其他格式的比較

XML

JSON與XML最大的不同在於XML是一個完整的標記語言,而JSON不是。這使得XML在程式判讀上需要比較多的功夫。主要的原因在於XML的設計理念與JSON不同。XML利用標記語言的特性提供了絕佳的延展性(如XPath),在数据存储,扩展及高级检索方面具备对JSON的优势,而JSON则由于比XML更加小巧,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。

YAML

在功能和语法上,JSON 都是 YAML 语言的一个子集。特别是,YAML 1.2规范指定“任何JSON格式的文件都是YAML格式的有效文件"。最常见的YAML解析器也能够处理JSON。版本 1.2 之前的 YAML 规范没有完全涵盖 JSON,主要是由于 YAML 中缺乏本机 UTF-32 支持,以及对逗号分隔空格的要求;此外,JSON 规范还包括 /* */ 样式的注释。YAML 最重要的区别是语法扩展集,它们在 JSON 中没有类似物:关系数据支持:在 YAML 文档中,可以引用以前在文件/流中找到的锚点;通过这种方式,您可以表达递归结构。支持除基元之外的可扩展数据类型,如字符串、数字、布尔值等。支持带缩进的块语法;它允许您在不使用不必要的符号的情况下描述结构化数据:各种括号、引号等。

MessagePack

MessagePack宣称比JSON更短小,快速。

格式化工具

JSON格式取代了XML给网络传输带来了很大的便利,但是却没有了XML的一目了然,尤其是JSON数据很长的时候,会让人陷入繁琐复杂的数据节点查找中。开发者可以通过在线JSON格式化工具,来更方便的对JSON数据进行节点查找和解析。

參考文獻

  1. ^ BigInt - MDN Web Docs Glossary: Definitions of Web-related terms | MDN. developer.mozilla.org. 2023-06-08 [2023-06-12]. (原始内容存档于2023-02-03) (美国英语). 
  2. ^ MDN-JSON标准. [2021-10-30]. (原始内容存档于2022-04-03). 
  3. ^ The JavaScript Object Notation (JSON) Data Interchange Format. IETF. December 2017 [16 February 2018]. (原始内容存档于2021-01-20). 
  4. ^ JSON and Browser Security. [2007-07-14]. (原始内容存档于2020-07-16). 
  1. Apple捷徑 (页面存档备份,存于互联网档案馆

參閱

外部連結

  • (英文) JSON(页面存档备份,存于互联网档案馆),關於JSON的規格、文件,以及在其他語言實做的資訊
  • JSON中文说明 (页面存档备份,存于互联网档案馆
  • (英文) RFC 4627,JSON在RFC裡的規格
  • JSON格式化工具 (中文) (页面存档备份,存于互联网档案馆
  • JSON编辑器 (页面存档备份,存于互联网档案馆
  • JSON分析器(页面存档备份,存于互联网档案馆
  • JSON到CSV转换器 (页面存档备份,存于互联网档案馆
  • Minecraft指令─JSON文字格式 (页面存档备份,存于互联网档案馆
  • JSON在线格式化工具
人类可读的格式
二进制格式
应用程序接口
文件系统(磁带)
  • 高级智能磁带英语Advanced Intelligent Tape
  • DDS英语Digital Data Storage
  • DLT英语Digital Linear Tape
  • Super DLT英语Digital Linear Tape
  • 全息通用光盘
  • Linear Tape-Open英语Linear Tape-Open(Ultrium-1)
  • VXA英语VXA
文件系统(磁盘)
图形
编程语言
无线链路接口
其他
Ecma標準列表(1961年 - 至今)
ISO標準
列表
国际标准化组织的标准列表英语List of International Organization for Standardization standards
国际标准化组织拉丁化方案列表
国际电工委员会标准列表英语List of IEC standards
1–9999
  • 1
  • 2
  • 3英语ISO 3
  • 4
  • 5
  • 6
  • 7英语ISO 7
  • 9
  • 16
  • 31
    • -0英语ISO 31-0
    • -1英语ISO 31-1
    • -2英语ISO 31-2
    • -3英语ISO 31-3
    • -4英语ISO 31-4
    • -5英语ISO 31-5
    • -6英语ISO 31-6
    • -7英语ISO 31-7
    • -8英语ISO 31-8
    • -9英语ISO 31-9
    • -10英语ISO 31-10
    • -11英语ISO 31-11
    • -12英语ISO 31-12
    • -13英语ISO 31-13
  • 128
  • 216
  • 217英语ISO 217
  • 226英语ISO 226
  • 228英语British standard pipe thread
  • 233
  • 259
  • 269
  • 302英语Kappa number
  • 306英语Vicat softening point
  • 428英语ISO 428
  • 518
  • 519
  • 639
  • 646
  • 690
  • 732
  • 764英语Antimagnetic watch
  • 843
  • 898英语ISO 898
  • 965英语ISO 965
  • 1000
  • 1004英语Magnetic ink character recognition
  • 1007
  • 1073-1英语OCR-A font
  • 1413英语ISO 1413
  • 1538
  • 1745英语ISO 1745
  • 1989
  • 2014英语ISO 2014
  • 2015英语ISO 2015
  • 2022
  • 2047英语ISO 2047
  • 2108
  • 2145
  • 2146英语ISO 2146
  • 2240
  • 2281英语Water Resistant mark
  • 2709英语ISO 2709
  • 2711英语ISO 2711
  • 2788英语ISO 2788
  • 2852英语ISO 2852
  • 3029英语126 film
  • 3103
  • 3166
  • 3297
  • 3307英语ISO 3307
  • 3602
  • 3758
  • 3864英语ISO 3864
  • 3901
  • 3977英语ISO 3977
  • 4031英语ISO 4031
  • 4157英语ISO 4157
  • 4217
  • 4909英语ISO/IEC 4909
  • 5218
  • 5428英语ISO 5428
  • 5775英语ISO 5775
  • 5776英语ISO 5776
  • 5800
  • 5807
  • 5964英语ISO 5964
  • 6166
  • 6344英语ISO 6344
  • 6346英语ISO 6346
  • 6385英语ISO 6385
  • 6425英语Water Resistant mark
  • 6429英语ANSI escape code
  • 6438
  • 6523英语ISO 6523
  • 6709
  • 7001
  • 7002英语ISO 7002
  • 7064英语ISO 7064
  • 7098
  • 7185
  • 7200英语ISO 7200
  • 7498
  • 7637
  • 7736英语ISO 7736
  • 7810
  • 7811英语ISO/IEC 7811
  • 7812
  • 7813英语ISO/IEC 7813
  • 7816
  • 8000
  • 8178英语ISO 8178
  • 8217
  • 8571英语FTAM
  • 8583英语ISO 8583
  • 8601
  • 8632
  • 8652英语ISO/IEC 8652
  • 8691英语ISO 8691
  • 8807英语Language Of Temporal Ordering Specification
  • 8820-5英语ISO/IEC 8820-5
  • 8859
  • 8879
  • 9000/9001
  • 9075
  • 9126
  • 9293
  • 9241英语ISO 9241
  • 9362
  • 9407
  • 9506英语Manufacturing Message Specification
  • 9529英语ISO 9529
  • 9564英语ISO 9564
  • 9594
  • 9660
  • 9897英语ISO 9897
  • 9899
  • 9945
  • 9984
  • 9985
  • 9995
10000–19999
  • 10005英语ISO 10005
  • 10006英语ISO 10006
  • 10007英语ISO 10007
  • 10116英语ISO/IEC 10116
  • 10118-3英语Whirlpool (cryptography)
  • 10160英语ISO 10160
  • 10161英语ISO 10161
  • 10165英语Guidelines for the Definition of Managed Objects
  • 10179英语Document Style Semantics and Specification Language
  • 10206
  • 10218英语ISO 10218
  • 10303
    • -11英语EXPRESS (data modeling language)
    • -21
    • -22英语ISO 10303-22
    • -28英语ISO 10303-28
    • -238英语STEP-NC
  • 10383英语ISO 10383
  • 10487英语ISO 10487
  • 10585
  • 10589
  • 10646
  • 10664
  • 10746英语RM-ODP
  • 10861英语Multibus
  • 10957
  • 10962英语ISO 10962
  • 10967英语ISO/IEC 10967
  • 11073英语ISO/IEEE 11073
  • 11170英语ISO 11170
  • 11179英语ISO/IEC 11179
  • 11404英语ISO/IEC 11404
  • 11544
  • 11783英语ISO 11783
  • 11784英语ISO 11784 & 11785
  • 11785英语ISO 11784 & 11785
  • 11801
  • 11898
  • 11940 (-2英语ISO 11940-2)
  • 11941英语ISO/TR 11941
  • 11941 (TR)英语ISO/TR 11941
  • 11992英语ISO 11992
  • 12006英语ISO 12006
  • 12182英语ISO/IEC TR 12182
  • 12207英语ISO/IEC 12207
  • 12234-2英语Tag Image File Format / Electronic Photography
  • 13211
  • 13216英语Isofix
  • 13250
  • 13399英语ISO 13399
  • 13406-2英语ISO 13406-2
  • 13450英语110 film
  • 13485英语ISO 13485
  • 13490英语ISO 13490
  • 13567英语ISO 13567
  • 13568英语Z notation
  • 13584英语ISO 13584
  • 13616
  • 14000
  • 14031
  • 14224英语ISO 14224
  • 14289英语PDF/UA
  • 14396
  • 14443
  • 14496
    • -2英语MPEG-4 Part 2
    • -3英语MPEG-4 Part 3
    • -6英语Delivery Multimedia Integration Framework
    • -10
    • -11英语MPEG-4 Part 11
    • -12英语MPEG-4 Part 12
    • -14
    • -17
    • -20
  • 14644英语ISO 14644
  • 14649英语STEP-NC
  • 14651英语ISO 14651
  • 14698英语ISO 14698
  • 14750英语ISO 14750
  • 14764
  • 14882
  • 14971英语ISO 14971
  • 15022英语ISO 15022
  • 15189英语ISO 15189
  • 15288英语ISO/IEC 15288
  • 15291英语Ada Semantic Interface Specification
  • 15292英语ISO 15292
  • 15398英语ISO 15398
  • 15408
  • 15444
    • -3英语Motion JPEG 2000
  • 15445
  • 15438
  • 15504
  • 15511
  • 15686英语ISO 15686
  • 15693英语ISO/IEC 15693
  • 15706
    • -2英语ISO 15706-2
  • 15707
  • 15897英语ISO 15897
  • 15919
  • 15924
  • 15926英语ISO 15926
  • 15926 WIP英语ISO 15926 WIP
  • 15930英语PDF/X
  • 16023英语MaxiCode
  • 16262
  • 16612-2英语PDF/VT
  • 16750
  • 16949 (TS)
  • 17024英语ISO/IEC 17024
  • 17025英语ISO/IEC 17025
  • 17100英语ISO 17100:2015
  • 17203
  • 17369英语SDMX
  • 17442英语Legal Entity Identifier
  • 17799
  • 18000英语ISO/IEC 18000
  • 18004
  • 18014英语ISO/IEC 18014
  • 18245英语ISO 18245
  • 18629英语Process Specification Language
  • 18916英语Photographic Activity Test
  • 19005
  • 19011英语ISO 19011
  • 19092 (-1英语ISO 19092-1
  • -2)英语ISO 19092-2
  • 19114英语ISO 19114
  • 19115英语ISO 19115
  • 19125英语Simple feature access
  • 19136
  • 19439英语ISO 19439
  • 19500
  • 19501
  • 19502
  • 19503英语XML Metadata Interchange
  • 19505
  • 19506英语Knowledge Discovery Metamodel
  • 19507英语Object Constraint Language
  • 19508
  • 19509英语XML Metadata Interchange
  • 19510
  • 19600:2014英语ISO 19600:2014
  • 19752英语ISO/IEC 19752
  • 19757英语RELAX NG
  • 19770英语ISO/IEC 19770
  • 19775-1
  • 19794-5英语ISO/IEC 19794-5
  • 19831英语Cloud Infrastructure Management Interface
20000+
  • 20000
  • 20022英语ISO 20022
  • 20121英语ISO 20121
  • 20400英语ISO 20400
  • 21000
  • 21047英语International Standard Text Code
  • 21500英语ISO 21500
  • 21827:2002英语ISO/IEC 21827
  • 22000
  • 22301
  • 23270
  • 23271
  • 23360
  • 24517英语PDF/E
  • 24613
  • 24617英语ISO-TimeML
  • 24707英语Common Logic
  • 24778
  • 25178英语ISO 25178
  • 25964英语ISO 25964
  • 26000英语ISO 26000
  • 26262
  • 26300
  • 26324
  • 27000 series
  • 27000英语ISO/IEC 27000
  • 27001
  • 27002
  • 27006英语ISO/IEC 27006
  • 27729
  • 28000英语ISO/PAS 28000
  • 29110英语ISO 29110
  • 29148英语Requirements engineering
  • 29199-2
  • 29500
  • 30170
  • 31000英语ISO 31000
  • 32000
  • 38500英语ISO/IEC 38500
  • 40500
  • 42010英语ISO/IEC 42010
  • 45001
  • 55000英语ISO 55000
  • 80000
    • -1英语ISO 80000-1
    • -2
    • -3英语ISO 80000-3
  • 参见:
  • 分类 ISO标准
  • 所有前缀有“ISO”的页面