Contents

Json Encoder-Decoder

导语
本篇主要介绍一下 JSON 相关内容

I. 何为 JSON ?

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

JSON(JavsScript Object Notation,JavsScript 对象表示法),由美国程序员道格拉斯·克罗克福特构想和设计的一种轻量级资料交换格式。 其内容由属性和值所组成,具有易于阅读和处理的优势。

JSON是独立于编程语言的资料格式,其不仅是JavaScript的子集,也采用了C语言家族的习惯用法,目前也有许多编程语言都能够将其解析和字符串化,其广泛使用的程度也使其成为通用的资料格式。

JSON

扩展名:.json

互联网媒体类型: application/json

类型代码: TEXT

统一类型标识: public.json

格式类型: 数据交换

扩展自: JavaScript

标准: RFC 7159, ECMA-404

网站: json.org


II. JSON 基本数据类型

数值

十进制数值,不能有前导0,可以为负数,可以有小数部分,不区分整数与浮点数。 也可以用 e/E 表示指数部分,不能包含非数(如 NaN)。

JSON
JavaScript 用双精度浮点数表示所有数值(后来也支持 BigInt)

字符串

以双引号 "" 括起来的零个或多个 Unicode 码位,支持反斜杠开始的转义字符序列。


布尔值

表示为 truefalse


数组

有序的零个或多个值

每个值可以为任意类型,并使用方括号[]包裹,元素之间使用逗号,分隔,例如[val, val].


对象

若干无序的"key-value"对(key-value pairs),其中 key 只能是字符串,并以花括号{}包裹,多个"key-value"之间使用逗号,分隔,keyvalue 之间使用冒号:分隔

建议但不强制要求对象中的键是独一无二的。


空值

表示为 null


JSON

JSON 交换时必须编码为UTF-8

转义序列可以为: \\, \", \/, \b, \f, \n, \r, \t 或 Unicode16 进制转义字符序列(\u后面跟随 4 位 16 进制数字)。

III. Example

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
    "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"
        }
    ]
 }

IV. 与其他格式的比较

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 文档中,可以引用以前在文件/流中找到的锚点;通过这种方式,您可以表达递归结构。
  • 支持除基元之外的可扩展数据类型,如字符串、数字、布尔值等。
  • 支持带缩进的块语法;
  • 它允许您在不使用不必要的符号的情况下描述结构化数据:各种括号、引号等。

V. Reference