欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JSON数据类型

程序员文章站 2024-01-30 16:43:58
...

2020-04-28

JSON 中的数据类型包括:

对象

JSON 中的对象类型非常简单。追根溯源,JSON 本身就是对象,也就是一个被花括号包裹的名称 - 值对的列表。如果你希望在作为对象的 JSON 中创建一个名称 - 值对,那就需要用到嵌套。

{
   "person": {
       "name": "Lindsay Bassett",
       "heightInInches": 66,
       "head": {
           "hair": {
               "color": "light blond",
               "length": "short",
               "style": "A-line"
               },
            "eyes": "green"
          }
      }
}

本例中,最高一级的名称 - 值对是 person,其值是一个对象。这一对象中
有三个名称 - 值对:“name”、“heightInInches” 和 “head”。“name” 这个名
称 - 值对的值是 “Lindsay Bassett”。“heightInInches” 的值是一个数字。
“head” 的值又是一个对象。其中 “hair” 的值同样是一个对象。这一对象中
包含了三个名称 - 值对:“color”、“length” 以及 “style”。“head” 的对象
中还有一个名称为 “eyes” 的名称 - 值对,其值为 “green”。

字符串

# 这不是一个合法的 JSON
{
  'title': 'This is my title.',
  'body': 'This is the body.'
}

这一点确实容易让人犯迷糊,尤其是在你之前接触过 JavaScript 对象字面量的情况下。在 JavaScript 中,使用单引号或双引号没有任何区别。然而请记住,JSON 不是 JavaScript 对象字面量,它只是基于 JavaScript 对象字面量。而在 JSON 中,仅允许使用双引号来包裹字符串

对解析器来说,当一个值以双引号(")开始时,它希望接下来的字符串文本以另一个双引号结尾。这意味着如果这段字符串本身包含双引号可能会出错。

# 这段代码不能正常使用
{
   "promo": "Say "Bob's the best!" at checkout for free 8oz bag of
    kibble."
}

由于在值里面有双引号,解析器在读取第一个双引号之后,会把“Bob”前
面的双引号当成字符串结尾的双引号。然后解析器发现后面还有许多不属
于任何一个名称 - 值对的文字,就会报错。为了处理这个问题,我们需要
在字符串中的双引号前面加上一个反斜线字符来对其转义。

{
   "promo": "Say \"Bob's the best!\" at checkout for free 8oz bag
    of kibble."
}

除了双引号和反斜线,还需要转义以下字符:

  • \/(正斜线)
  • \b(退格符)
  • \f(换页符)
  • \t(制表符)
  • \n(换行符)
  • \r(回车符)
  • \u 后面跟十六进制字符(如笑脸表情 \u263A)

数字

JSON 中的数字可以是整数、小数、负数或者指数。

布尔值

在 JSON 中,该字面值仅使用小写形式:truefalse,任何其他
形式的写法都会报错。

null

对于一无所有的东西,你可能觉得用 0 来描述比较合适。比如,我有 0 个
手表。但事实是,0 是一个数字。这意味着本质上是在计数。

不要把 nullundefined 混淆,尤其是在使用 JavaScript 时。undefined 不是 JSON 中的数据类型,而在 JavaScript 中,undefined 是在尝试获取一些不存在的对象或变量时返回的结果。在 JavaScript 中,undefined 与那些声明的名称和值都不存在的对象或变量有关,而 null 则仅与对象或变量的值有关。null 是一个表示“没有值”的值。在 JSON 中,null 必须使用小写形式

数组

数组始终应被方括号([])包裹。在数组中,可以看到一个列表,列表项之间用逗号隔开。这有点像处理名称 - 值对的方式,不过一个关键的区别是这个列表里只有值。这些值可以是任何合法的 JSON 数据类型(字符串、数字、对象、布尔值、数组以及 null)。

一个数组为每一个“位置”都赋予了一个索引。我们从 0 开始,那么第一个位置的序号便是 0,第二个位置的序号是 1,以此类推。

在 JSON 中,数组里可以包含任何支持的数据类型。所以可以有字符串构成的数组、数字构成的数组、布尔值构成的数组、对象构成的数组,甚至是数组构成的数组。数组构成的数组也被称为多维数组。

JSON Schema

JSON Schema 使用 JSON 来书写,所以仅需几步就能掌握它。首先,需要在 JSON 第一个名称 - 值对中,声明其为一个 schema 文件。

# 声明的名称必须为 "$schema",值必须为所用草拟版本的链接
{
   "$schema": "http://json-schema.org/draft-04/schema#"
}

第二个名称 - 值对应该是 JSON Schema 文件的标题

# 表示一只猫的 JSON Schema 文件格式
{
   "$schema": "http://json-schema.org/draft-04/schema#",
   "title": "Cat"
}

在 JSON Schema 文件的第三个名称值对中,要定义需要在 JSON 中包含的属性。“properties” 的值实质上是我们想要的 JSON 的名称 - 值对的骨架。我们没有使用字面量,而是使用了一个对象来定义数据类型,并有选择地进行描述

# 定义猫的属性
{
   "$schema": "http://json-schema.org/draft-04/schema#",
   "title": "Cat",
   "properties": {
     "name": {
     "type": "string"
     },
     "age": {
       "type": "number",
       "description": "Your cat's age in years."
       },
     "declawed": {
       "type": "boolean"
       }
     }
}

接下来就能验证 JSON 是否符合 JSON Schema

# 这个 JSON 符合针对猫定义的 JSON Schema
{
   "name": "Fluffy",
   "age": 2,
   "declawed": false
}

JSON Schema 可以帮助回答下列问题:

  • 值的数据类型是否正确?
    可以具体规定一个值是数字、字符串等类型。
  • 是否包含所需要的数据?
    可以具体规定哪些数据是需要的,哪些是不需要的。
  • 值的形式是不是我需要的?
    可以指定范围、最小值和最大值。