什么是JSON
- JSON是一种数据交换格式。数据交换格式是一种在不同平台间传递数据的文本格式,像JSON,XML等。
- JSON独立于编程语言(你不必先学JavaScritp)。
- JSON基于JavaScript对象字面量表示法(重点在于‘表示法’)。
- JSON表达数据的方式对通用的编程概念都很友好。
JSON语法
1、JSON基于JavaScript对象字面量
所谓字面量,是对数据值的具体表示。它的字面意思与其想要表达的意思是完全一致的。
2、名称-值对
计算机世界里,名称-值对也被称为键-值对、属性-值对或字段-值对,它们都表示一个意思。
3、正确的JSON语法
示例:
"property":"value"
在名称中使用多个单词时,我一般会采用驼峰法,就是第一个以外的单词的首字母大写,像这样:lindSayAnimal,但是也可以使用别的方法,
甚至在双引号中使用单引号,像下面这样:
"my animal": "dog",
"lindsay's animal": "cat"
这样的写法完全是合法的,但是我建议你最好不要这么做,因为JSON中的名称-值对是一种对很多系统都十分友好的数据结构,而使用空格
和特殊字符(即A~Z、0~9除外的其他字符)忽略了[可移植性](https://baike.baidu.com/item/%E5%8F%AF%E7%A7%BB%E6%A4%8D%E6%80%A7)。
当然,另外需要注意的是,不用于名称,值并不总是需要被双引号包裹。当值是字符串时,必须使用双引号。而在JSON中,还有数字、
布尔值、数组、对象、null等其他数据类型。这些都不应该被双引号包裹。
JSON的全程是javascript对象表示法。接下来了解一下构建一个对象的语法。我们将花括号加在名称-值对的两边来使之成为一个对象。像下面这样,
一个在前,一个在后:
{"my animal": "dog"}
在JSON中,多个名称-值对使用逗号来分隔。这里我就不细说了。
4、JSON文件使用.json 拓展名
5、JSON媒体类型是application/json
JSON的数据类型
1、对象数据类型
JSON中的对象数据类型非常简单。追根溯源,JSON本身就是对象,也就是被花括号包裹的名称-值对的列表。对象可以嵌套。
2、字符串类型
简单的字符串类型,比如前面提到的"cat"我就不多说了 ,下面重点讲一下稍微复杂一点的。在这之前,我觉得有必要说一下解析器是如何读JSON
的。对于解析器来说,当一个值以双引号(")开始时,它希望接下来的字符串文本以另一个双引号结尾。这意味着这段字符串本身包含
双引号可能会出错。我不知道你是否理解我的意思,我们看一个例子吧:
{
"promo":"say "BOB'S the best!" at the checkout foe free 8oz bag of kibble."
}
在上面这个例子里,会出现一个问题,因为这时不能仅用一对双引号来包裹数据。否则解析器在解析的时候,遇到第二个双引号就会把它
当成结尾的双引号。然后解析器会发现后面还有很多不属于任何名称-值对的文字,这时就会报错。那么怎么解决这个问题呢?当然是
通过**转译**。也就是在需要转译的字符前面加上一个反斜杠。
还有一些需要转译的字符,就自己百度吧。
3、数字类型
4、布尔类型
5、null类型
6、数组类型
JSON中的数组类型呢也是一个比较重要的类型,上面用的不多的我就不细说,你记住就好。废话不多说,先来看一个例子吧:
{
"eggCarton":[
"eggs",
"eggs",
"eggs"
]
}
//这里名称是eggCarton
//值是数组
列表项是用逗号隔开,有点像名称-值对的方式,不过关键的区别在于这个列表里面只有值。
JSON Schema
- JSON验证器负责验证语法错误,JSON Schema负责提供一致性检验。这里需要强调一下"一致性检验",有兴趣可以了解一下。
- JSON Schema解决的下列有关一致性验证的问题:
- 值的数据类型是否正确?
- 是否包含所需要的数据?
- 值的形式是不是我们需要的?
JSON 的安全性问题
对于这个呢我也只是粗略的了解,接下来我也只能简单的介绍了:
1、跨站请求伪造CSRF:
-
方式:浏览器对于不同域名的站点之间进行资源分享有一定的限制规则。黑客使用<script>标签来绕开这些规则。有时我们会使用其他站点提供
的脚本,所以<script>标签不受规则的限制。使用顶层级别数组的JSON是合法的javascrip代码。 -
原因:这样的攻击能够实现主要是利用你和网站之间的凭证,利用信任关系。
-
解决方法:用POST替代GET;
拓展一下:
顶层JSON数组指存在于JSON名称-至对之外的位于文档最顶层的JSON数组
2、跨站脚本攻击XSS
-
方式:当我们从第三方网站获取JSON数据时,很可能数据被劫持,从而运行一些恶意代码。
-
解决方法:用JSON.parse(jsonString)代替eval();
-
原因:eval()函数会解析并执行解析出来的代码;JSON.parse()只会解析JSON,不会执行代码。
3、安全漏洞:决策上的失误
这个主要是在一些虽然规范但其实不规矩,比如JSON中包含<html>标签,这时候解析可能就会出问题,就会被攻击;
解决方法也是有的,把HTML代码进行转码。
JSON和客户端框架
- jQuery:是一种允许开发者专注于操作DOM构建功能的抽象化工具。
- AngularJS:致力于为用户提供无缝交互的应用体验。
最后
还有一些序列化、反序列化与请求JSON什么的,就不说了。精神高度集中的写这篇笔记,感觉很充实,虽然很累,虽然写的也不好
网友评论