JSON数据类型

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 可以帮助回答下列问题:

  • 值的数据类型是否正确?
    可以具体规定一个值是数字、字符串等类型。
  • 是否包含所需要的数据?
    可以具体规定哪些数据是需要的,哪些是不需要的。
  • 值的形式是不是我需要的?
    可以指定范围、最小值和最大值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值