JSON

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

JSONJavaScript 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用双精度浮点数表示所有数值。
  • 字串:以双引号""括起来的零个或多个Unicode码位。支持反斜杠开始的转义字符序列
  • 布尔值:表示为true或者false
  • 陣列:有序的零个或者多个值。每个值可以为任意类型。序列表使用方括号[]括起来。元素之间用逗号,分割。形如:[value, value]
  • 物件:若干无序的“键-值对”(key-value pairs),其中键只能是字符串[1]。建议但不强制要求对象中的键是独一无二的。对象以花括号{开始,并以}结束。键-值对之间使用逗号分隔。键与值之间用冒号:分割。
  • 空值:值写为null

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

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

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

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

应用领域

WEB开发

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

NoSQL数据库

相对于传统的关系型数据库,一些基于文档存储的NoSQL非关系型数据库选择JSON作为其数据存储格式,比较出名的产品有:MongoDBCouchDB、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":
                    {
                         "extra": "something"
                    }
               }
     },
     {
          "translate": "item.dirt.name",
          "color": "blue",
          "italic": "true"
     }
]

安全問題

读取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方法进行读取[3]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更加小巧,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。

MessagePack

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

格式化工具

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

參考文獻

  1. ^ MDN-JSON标准. [2021-10-30]. (原始内容存档于2022-04-03). 
  2. ^ The JavaScript Object Notation (JSON) Data Interchange Format. IETF. December 2017 [16 February 2018]. (原始内容存档于2021-01-20). 
  3. ^ 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
文件系统(磁盘)
图形
  • 通用3D英语Universal 3D
编程语言
无线链路接口
其他
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
  • 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英语ISO/IEC 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英语ISO 22000
  • 23270
  • 23271
  • 23360
  • 24517英语PDF/E
  • 24613
  • 24617英语ISO-TimeML
  • 24707英语Common Logic
  • 24778
  • 25178英语ISO 25178
  • 25964英语ISO 25964
  • 26000英语ISO 26000
  • 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”的页面