JSON必知必会

最近看了《JSON必知必会》,做些记录。其实主要是想讲讲语法验证和一致性验证

文末亦有书籍的相关信息(书名,作者,ISBN)。

基础知识

老司机可以跳过这段

什么是JSON。JSON是一种数据交换格式。数据交换格式是一种在不同平台间传递数据的文本格式。除JSON外,你也可能听说过XML这种数据交换格式。像XML和JSON这样的数据交换格式非常重要,我们需要它们来实现不同系统间的数据交换。

JSON是一种被许多系统用于交换数据格式的数据交换格式,但不是所有的系统都支持使用JSON来交换数据。

JSON的全称是Javascript Object Notation(Javascript对象表示法)。JSON基于Javascript对象字面量。JSON独立于编程语言(你不必先学习JS)。

当然如果你会JS,那就再好不过了。

什么是表示法

一个用于表示诸如数字或单词等数据的字符系统

什么是字面量

所谓字面量,是对数据值的具体表示。它的字面意思与其想要表达的意思完全一致。

    a=5
    a=a+5

a的值是10,是一个变量。这里,5就是5,是字面量

JSON的表示形式是名称-值对。也叫键-值对,属性-值对,或者字段-值对。
JSON中使用冒号(:)来分隔名称和值。名称始终在左侧,值始终在右侧。

比如,使用JSON来描述我的内裤

    {
        "brand":"CK",
        "Color":"black",
        "size":23
    }

JSON中的名称-值对列表被花括号包裹

名称必须被双引号包裹,而值并不是总是需要被双引号包裹。

当值是字符串时,必须使用双引号。而在json中,还有数字、布尔值、数组、对象、null等其他数据类型,而这些都不应该被双引号包裹。

双引号中的名称可以是任何有效的字符串,例如

    "My animal":"cat"
    "Sail's animal":"dog"

在JSON中是完全合法的。但是最好不要这样做。

因为,JSON中的名称-值对是一种对许多系统都十分友好的数据结构,而使用空格和特殊字符(字母和数字以外)忽略了可移植性(以一种双方系统都兼容的方式在平台间传递信息)。如果我们这样做的话,会降低JSON数据的可移植性


JSON文件

JSON这种数据交换格式是可以作为独立的文件存在于文件系统中的。它的文件扩展名非常好记.json。

JSON的媒体类型

媒体类型也叫作,互联网媒体类型,内容类型,MIME类型
它使用“类型/子类型”这种格式来表示,比如text/html
JSON的MIME类型是application/json

JSON中的布尔类型

只能使用小写 true或false,其他的TRUE/FALSE都是错误的

JSON中的null类型,也必须使用小写


语法验证

语法验证关注的是JSON的格式,检测我们的JSON语法是否正确(是否被被花括号包括,名称-值对是否以逗号分隔)。

JSON语法验证工具

这是一个带有配置选项、能够高亮错误且UI很棒的格式化工具。经过处理的JSON会显示在两个窗口,一个用于展示JSON的树/节点结构,类似于可视化工具,另一个用于复制/粘贴格式化后的代码

这是一个集验证、格式化和可视化工具于一身的JSON工具。错误提示会显示在出错的那一行。除了验证以外,还会显示解析错误的详情,右边的可视化工具使用树/节点的形式来展示JSON。

这是一个毫不花哨的JSON验证工具。简单的复制、粘贴、验证即可。也可以友好地格式化你的JSON。

以上都是语法验证工具。

一致性验证关注的是其独特的数据结构,会检测我们的数据是否包含name,breed和age等信息。它还会检测
age的值是不是数字,name的值是不是字符串,等等......


一致性验证

JSON验证器负责验证语法错误,JSON Schema负责提供一致性验证。

JSON Schema(Schema意为模式),数据交换中的一种虚拟“合同”。
JSON Schema是数据接收方的第一道防线,也是数据发送方节约时间、保证数据正确的好工具。

JSON Schema可以解决以下有关一致性验证的问题

  • 值的数据类型是否正确?
    可以具体规定一个值是数字、字符串类型

  • 是否包含数据所需要的数据?
    可以具体规定哪些数据是需要的,哪些是不需要的

  • 值的形式是不是我需要的?
    可以指定范围、最小值和最大值

尽管JSON已经相当成熟,但JSON Schema仍在开发当中。截至2015年4月,JSON Schema最新版是草拟版本4。当然这并不意味着你现在不可以使用它,这仅仅说明了它仍旧在成长当中,且将来会做得更好。

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

    {
        "$schema": "http://json-schema.org/draft-04/schema#"
    }

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

    {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title":"cat"
    }

第三个名称-值对,要定义需要在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"
          },
        "description":{
                    "type":"string"
         }
        }
    }

如果想实现某些字段不能漏填,需要加上在"$schema","title","properties"后面加上第四个名称-值对,它的名称是
"required",值为一个数组,数组中包含必填字段。

假设"name","age","declawed"是必填字段,所以把它们加入数组。"description"不是必填字段,就不应加入数组

    {
        "$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"
          },
        "description":{
                    "type":"string"
         }
        },
        "required":[
            "name",
            "age",
            "declawed"
        ]
    }

例如

    {
        "name":"Fluffy",
        "age":2,
        "declawed":"false",
        "description":"hello world."
    }

    {
        "name":"Fluffy",
        "age":2,
        "declawed":"false"
    }

以上两个都是合法的JSON。

需要提一下的是,如果你JSON Schema中不包含"required"名称-值对,那么将不会有必填项。一个没有任何名称-值对的空JSON对象也被认为是合法的。例如

    {}

也是合法的JSON。

现在还有一个问题,值的形式是不是我们所需要的?比如用户名不能超过30个字符,年龄不为负数等。

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title":"cat",
    "properties":{
    "name":{
        "type":"string",
        "minLength":3,
        "maxLength":20
       },
    "age":{
        "type":"number",
        "description":"your cat's age in years.",
        "minmum":0
       },
    "declawed":{
        "type":"boolean"
      },
    "description":{
                "type":"string"
     }
    },
    "required":[
        "name",
        "age",
        "declawed"
    ]
}

以上只是JSON Schema的冰山一角,JSON Schema还支持正则表达式等。
如果你希望深入了解掌握JSON Schema,可以访问以下链接

JSON Schema在线检测工具

《JSON必知必会》一书还讲到了一些安全方面的问题,跨站请求伪造,注入攻击等。

有兴趣的话可以买来看看。

<i>Introduction to Javascript Object Notation<i/> by Lindsay Bassett(O'Reilly).
Copyright 2015 Lindsay Bassett,978-1-491-92948-3.

![Uploading JSONbzbh_032355.png . . .]

** 本文已经更新在我的个人博客 ,欢迎访问**
** 未经授权,禁止转载**

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容