什么是JSON?JSON的全称是JavascriptObjectNotation(对象表示法),是一种用于在不同平台之间传输数据的文本格式(数据交换格式)。常见的数据交换格式包括XML和JSON。我们主要研究JSON。数据交换格式非常重要,开发人员需要使用它们在不同系统之间交换数据。JSON基于Javascript对象字面量,但独立于任何编程语言,真正重要的是符号本身,因此您不必在学习JSON之前学习Javascript。当然,如果有Javascript基础就更好了。JSON语法JSON使用键值对的数据结构,如下:{"name":"dawei","age":22,"isMan":true}名字总是需要用双引号括起来,多个键值对使用逗号分隔。以下两种表示都是错误的:{name:"dawei"}ThisisaJavascriptobjectnotJSON{'name':'dawei'}这也是一个Javascript对象,因为Javascript对象中允许使用单引号而不是双引号。JSON数据交换格式可以作为一个独立的文件存在于文件系统中,文件扩展名为.json。传输数据时,需要提前告知接收方要接收什么类型的数据。这时候就会涉及到媒体类型,也称为内容类型或MIME类型。常见的MIME类型是text/html,JSON的MIME类型是application/json。JSON数据类型JSON中的数据类型包括:Object、String、Number、Boolean、null和Array。对象类型JSON中的对象类型非常简单。JSON本身就是一个对象,是一对花括号{}括起来的键值对列表。对象可以嵌套。对象可以包含多个键值对。键必须是字符串,值可以是合法的JSON数据类型(字符串、数字、对象、数组、布尔值或空值)。{"person":{"name":"dawei","age":23,"isBoy":true}}JSON中的字符串类型必须也只能用双引号括起来。在JSON中,键都是字符串类型。在Javascript中,使用单引号和双引号没有区别。但是JSON不是Javascript对象字面量,它只是基于Javascript对象字面量。对于JSON解析器,当值以双引号开头时,它期望后面的字符串文字以另一个双引号结尾。这意味着如果字符串本身包含双引号可能会报错。这时候我们就需要使用反斜杠对字符串中的双引号进行转义。{"promo":"Hesay\"Bob`sthebest!\"atclassroom"}数字类型JSON中的数字类型可以是整数、小数、负数或指??数。Boolean类型JSON中的Boolean值只能使用小写形式:true或false,其他任何写法都会报错。JSON中使用null类型表示什么都没有,不存在等。对于下面的例子,由于对象没有戴手表,所以没有手表颜色:{"freckleCount":0,"fairy":true,"watchColor":null}Array类型数组应始终用方括号[]括起来。数组中的值以逗号分隔。这些值可以是任何合法的JSON数据类型。所以你可以有字符串数组、数字数组、布尔数组、对象数组,甚至数组数组。数组也可以包含不同数据类型的值:{"eggCarton":["egg",null,"egg",5,"egg"]}这在JSON中也是合法的,但是我们应该避免这样使用.因为如果我们将包含不同数据类型数组的JSON传给一个没有使用Javascript的系统,在解析的时候很可能会报错。JSON架构(Schema)JSON中的数据通过互联网或其他网络传输给接收方,接收方会对自己将接收到的数据有一个期望。收件人将提供一份文件,解释预期的格式并提供示例。此外,JSONSchema也可以被发送者另一端的接收者使用。JSONschema往往放在接收数据的第一行,以保证数据符合要求。我们将上述方式统称为“一致性验证”。这里我们需要验证三个方面:值的类型是否正确——可以指定一个值是否为数字、字符串等,是否包含需要的数据——可以指定需要哪些数据,需要哪些数据是不需要的,值的形式是否是我们需要的——你可以指定范围,最小值和最大值。JSONSchema是用JSON编写的。一个完整的JSONSchema格式文件如下:{"$schema":"http://json-schema.org/draft-04/schema#","title":"Cat","properties":{"name":{"type":"string","minLength":3,"maxLength":20},"age":{"type":"number","description":"你猫的年龄。",“最小值”:0},“去爪”:{“类型”:“布尔值”},“描述”:{“类型”:“字符串”}},“必需”:[“名称”,“年龄”,"declawed"]}在这个文件中,第一个键值对声明了一个schema文件,第二个键值对是文件的标题,第三个键值对是需要包含的属性JSON,第四个键值对指定必须包含的属性。在属性值中,声明了属性类型、属性的描述和取值范围。JSON中的安全问题JSON本身不存在任何安全问题,但是在Web中使用JSON时经常会出现两个安全问题:跨站请求伪造和跨站脚本攻击。跨站请求伪造跨站请求伪造(CSRF)是一种利用站点对用户浏览器的信任的攻击。这种信任实际上是用户的登录凭据。为了获取用户的凭据,黑客会在用户登录网站时向用户发送大量伪造的“消息提示”。目的是让用户点击它并访问它。网站。一旦用户点击消息提醒并访问恶意网站,黑客就可以获得用户的敏感信息(登录凭证)进行攻击:一般安全意识较差的网站使用如下JSONURL存储敏感信息:[{"username":"dawei"},{"phone":"555-555-555"}]这里的JSON格式为合法的,但是非常危险,因为它也是一个可执行的JS脚本,黑客很容易将其保存到自己站点的脚本中。如何防止CSRF攻击?首先,该数组应作为一个值存储在JSON对象中,因此该数组将不再是有效的JavaScript,脚本将无法加载它。{"info":[{"username":"dawei"},{"phone":"555-555-555"}]}其次,站点应该只允许post请求,静态使用get请求。这样黑客就无法使用脚本中的URL。注入攻击注入攻击是利用系统本身的漏洞,向网站注入恶意代码进行攻击。跨站脚本攻击跨站脚本攻击(XSS)是一种注入攻击。使用JSON时的一个常见安全漏洞通常发生在Javascript从服务器获取JSON字符串并将其转换为JavaScript对象时。在JavaScript中,您可以使用eval()函数来执行此操作:varjsonString='{"animal":"cat"}';varmyObject=eval("("+jsonString+")");警报(我的对象.动物);这看起来没什么问题,但是如果服务器或者服务器发送的json被攻击携带恶意代码,情况就很糟糕了:varjsonString="alert('thisisbadcode')";varmyObject=eval("("+jsonString+")");alert(myObject.animal);eval()的问题在于它会对传入的字符串不加区分地进行编译和执行,这会给黑客以可乘之机,很可能给我们带来不可估量的损失。为了解决这个问题,引入了JSON.parse()方法,只解析JSON,不执行脚本:varjsonString='{"animal":"cat"}';varmyObject=JSON.parse("("+jsonString+")");alert(myObject.animal);待续...
