json--一种数据交换格式

阅读数:1669 发布时间:2016-08-05 09:29:25

作者:zzl005 标签: json 朱忠来005

json 是什么

json 是一种数据交换格式。

(数据交换格式是一种在不同平台间传递数据的文本格式。)

  1. json 独立于编程语言
  2. 全称是JavaScript Object Notation(JavaScript 对象表示法)
    • 关于这个名称,很容易造成误解,虽然 json 源于 JavaScript ,但是 json 是通用的数据交换格式,可以用在不同的系统,不同的语言中。
    • json 是源于 JavaScript 字面量的。
    • 所以,我们可以这么理解 json :一种基于对象表示法的数据交换格式
      • 对象,是面向对象编程中很常见的概念。
      • 而不太容易理解的是表示法,表示法是指一个可以表示如数字或单词等数据的字符系统
  3. json 之所以流行,是因为其不仅独立于语言,而且使用了一种在许多编程语言中都能找到共同元素的表达方式。
    • 通过这种表达数据的方式,即便是那 些不支持面向对象编程的语言,也会发现 JSON 这种格式是可以接受的。

json的文件,媒体类型

json 语法

示例

JSON 所基于的 JavaScript 对象字面量单纯指对象字面量及其属性的语法表示,而且这种属性表示方法也就是通过名称 - 值对来实现的。

json 的最外层为花括号{ },表示一个对象,而括号里面,都是由被称为名称-值对(键值对)组成。

{
    "animal" : "horse"
 }    

上面这个就是最简单的一段 json 数据。

正确的 json 语法

  1. 先来看看:名称-值对中的名称。 在,json 中名称即上面的"animal",必须
    1. 双引号包裹
    2. 而且是有效的字符串
      • 最好是英文字母 A~Z 或 a~z。
  2. 多个名称-值对用逗号隔开

json 的数据类型

上面说了,名称-值对中的名称为双引号包裹的字符串,而 json 的数据类型指的是值对的数据类型。
包括:


json 中的字符类型

重点要说的是字符串类型,在 JavaScript 中,使用单引号或双引号没有任何区别,但是 json 只是基于 JavaScript 对象字面量。 而在 json 中,仅允许使用双引号来包裹字符串

另外,json 中的字符串还涉及到一个转义的问题,即解析器在解析 json 时,当读到一个双引号 " 时,就认为接下来是一个字符串文本,并且预期有另一个双引号 " 结尾,这就意味着,如果这段字符串本身含有双引号,那么就有可能会解析错误。

为了处理这个问题,我们需要 在字符串中的双引号前面加上一个反斜线字符来对其转义

另外还有其他一些需要转义的字符:

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

json 数据的一致性验证

发送方和接收方都可以使用 json Schema 来校验数据。

  1. 对于发送方来说,在发送数据前,随时可以验证数据是否与 Schema 一致,以便知道会不会被接收方接受。如果出现错误,也可以轻松定位和修复。
  2. 对于接收方来说,可以将 json Schema 放在接收数据的第一行,以保证数据符合要求。主要在数据被处理前回答三个问题。

json Schema

json Schema 也是使用 json 来书写。

一、第一个名称 - 值对中,声明其为一个 schema 文件。声明的名称必须为 "$schema",值必须为所用草拟版本的链接。

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

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

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

三、 第三个名称值对中,要定义需要在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"
         }
    } 
}

在第三个名称 - 值对中,我们验证了第一个问题,值的类型是否正确
如果需要验证第二个问题--是否包含所需要的数据。就需要第四个名称 - 值对。

四、 第四个名称 - 值对,名称为 "required",值为数组,数组中包含必填的字段

{
    "$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"
] }

下面是一个合法的 json:

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

注:
如果你的 json Schema 中不包含 "required" 名称-值对,那么将不会有必填项。

下面解决第三个问题:值的形式是不是我需要的?

这个可以通过对数据的格式提出更具体的要求来实现,比如设置数字的最大、最小值,字符串长度的最长最短等等。

下面是示例:

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

json Schema 同时还支持正则表达式和枚举类型

json 中的安全问题

json 本身并不会造成什么安全问题,可能会出现问题的是 json 的使用。
主要是两点:

  1. 跨站请求
  2. 跨站脚本攻击

跨站请求伪造

跨站请求伪造,即 CSRF(cross-site request forgery,读作 sea-surf),是一种 利用站点对用户浏览器信任而发起攻击的方式。

相关文章推荐: