JSON初识
什么是JSON
1.JSON是一种数据格式
这里用一张图解释
图中每一种颜色的圆圈相当于一种语言,例如python,C/C++,Java等,那么这些不同的语言之间如何沟通,如何传输数据呢?JSON就相当于游走于这些岛屿之间的商船,来使说不同语言的岛屿的人能够传递“商品”,互相沟通。
2.JSON不是独立的编程语言
JSON全称是Javascript Object Notation(JavaScript对象表示法)。从名称我们也能过大致了解到JSON到底是什么,JSON是一种方法,这个方法是来源于JavaScript语言中的,所以JSON不是独立的编程语言,而是一种在许多编程语言中都能找到共同元素的表达方式。
JSON语法
1.基于对象字面量
literal(字面量),是对数据值的具体表示。数据交换格式的核心是数据,所以JSON不会涉及到JavaScript对象字面量中的函数
2.名称-值对(键-值对)
{
"animal" : "cat",
"animal" : "dog",
"animal" : "horse"
}
看上述代码,一个名称,一个值,即名称-值对。
3.JSON语法
JSON中的名称是用双引号包含(不可以用单引号!必须用双引号包含!),里面可以包括空格,甚至单引号。JSON的全称是对象表示法,用花括号包含名称值对则成为了一个对象,如:
{
"animal" : "cat"
}
多个名称-值对之间用逗号分隔
JSON的数据类型
1.数据类型
数据类型和我们常见的数据类型是类似的
- 整型
- 浮点型
- 定点数
- 字符和字符串
- 布尔类型
- 数组
2.JSON中的对象数据类型
嵌套对象的使用
{
"person" : {
"name" : "Lindsay Bassett",
"heightInInches" : 66,
"head" : {
"hair" : {
"color" : "light blond",
"length" : "short",
"style" : "A-line"
},
"eyes" : "green"
}
}
}
3.JSON中字符串类型的使用
当双引号中出现双引号时,会被当做是字符串结尾的双引号。那么为了解决这种问题,就需要在字符串前加上反斜线来对其进行转义,如下所示
{
"what" : "Place say \"I am the best!\" now"
}
但是有时候反斜线反而会引起报错,比如下面这个例子
{
"location" : "C:\program Files"
}
这个时候就需要用反斜线来转义反斜线,如下
{
"loacation" : "C\\program Files"
}
那么在json中都有哪些需要转移的字符呢,有以下几种
- /(正斜线)
- \b(退格符)
- \f(换页符)
- \t(制表符)
- \n(换行符)
- \r(回车符)
- \u后面跟十六进制字符(如\u263A)
4.JSON中的数字类型
如下示例
{
"num1" : 123,
"num2" : 11.25,
"num3" : -1234.54684,
"num4" : 4.6489e+24
}
5.JSON中的布尔类型
布尔类型就是true
和false
{
"left" : true,
"right" : false
}
6.JSON中的null类型
null不能用0来表示,0是数字,所以json中的null一定要用小写来表示
7.JSON中的数组类型
如下
{
"nums" : [
1,
2,
3,
4,
5,
6,
7,
8,
9
]
}
甚至数组中的数据类型可以是混合的,如下
{
"mixed" : [
1,
2,
"hello",
3,
4,
null,
5
]
}
JSON Schema
1.简介
书写示例
{
"$schema" : "http://www.jlx-love.com/schema#",
"title" : "cat",
"properties" : {
"name" : {
"type" : "string"
},
"age" : {
"type" : "number",
"description" : "Your cat's age in years."
},
"declawed" : {
"type" : "boolean"
}
},
"required" : [
"name",
"age",
"declawed"
]
}
-
首先声明的名称必须是
"$schema"
,值必须得是一个链接。 -
以表示一个猫为例,第二个我们写的是
title
-
第三个是猫的属性
-
第四个是必填字段数组,就是你传一个数据,这个数组里的东西你是一定要有的。
所以,schema到底是干什么的?schema就是用来帮助我们回答下列问题的。
- 值的数据类型是否正确?
- 是否包含所需要的数据?
- 值的形式是不是我需要的?
JSON中的安全问题
1.跨站请求伪造(CSRF)
CSRF是一种利用站点对用户浏览器信任而发起攻击的方式。那么JSON如何和安全问题挂钩呢?
- JSON中保存敏感信息
[
{
"user" : "bobbarker"
},
{
"phone" : "111-222-3333"
}
]
上述代码情况并没有在最外面加花括号,这种情况叫做顶层JSON数组。但也正因为这种使用方式,使得我们可以利用它。关于跨站请求伪造这里不详细阐述。主要利用过程就是取得网站的信任。其实就是取得了你和网站之间的凭证,然后里利用你的凭证就可以登录网站。
解决这种安全隐患可以将数组存放到对象之中,使其成为非法的JavaScript,这样就不会被script
标签加载。
{
"info" : [
{
"user" : "bobbarker"
},
{
"phone" : "111-222-3333"
}
]
}
再者我们需要用户使用POST请求获取数据,进制GET请求。因为GET请求数据会直接获得script
标签
注入攻击
跨站脚本攻击(XSS)。JSON本身仅仅只是一段文本。如果要对对象的文本进行操作,就必须首先将文本转换成对象并装入内存中。在JavaScript中,可以使用eval()函数来完成这一操作。该函数获取一段字符串,并对其进行编译和执行。
被eval()函数执行的alert:
var jsonString = "alert('this is bad')";
var my0bject = eval("(" + jsonString + ")");
alert(my0bject.animal);
解决方法使用JSON.parse()函数。因为该函数仅仅解析JSON,而并不会执行脚本
var jsonString = '{"animal" : "cat"}';
var my0bject = JSON.parse(jsonString);
alert(my0bject.animal);
JavaScript中的XMLHttpRequest与Web API
XMLHttpRequest负责在客户端发起请求,Web API负责在服务端发返回响应。Web API是通过HTTP服务进行交互的一组指令和标准,这些交互可以包括创建,读取,更新,删除等操作。
PayOal API的一张JSON发票
{
"merchant_info" : {
"email" : "amengsec@qq.com",
"first_name" : "ameng",
"last_name" : "sec",
"business_name" : "Amengsec",
"phone" : {
"country_code" : "086",
"national_number" : "12345678912"
},
"address" : {
"line1" : "123 qwe",
"city" : "Somewhere",
"state" : "OR",
"postal_code" : "97520",
"country_code" : "CN"
}
},
"billing_info" : [
{
"email" : "amengsec@qq.com"
}
],
"items" : [
{
"name" : "Widgets",
"quantity" : 20,
"unit_price" : {
"currency" : "CNY",
"value" : 100
}
}
],
"note" : "Special Widgets Order!",
"payment_term" : {
"term_type" : "NET_45"
},
"shipping_info" : {
"first_name" : "asd",
"last_name" : "qwe",
"business_name" : "Not applicable",
"address" : {
"line1" : "456 qweqwrfas",
"city" : "Somewhere",
"state" : "OR",
"postal_code" : "97501",
"country_code" : "CN"
}
}
}
XMLHttpRequest中包含的函数和属性
函数:
- open(method, url, async(可选), user(可选), password(可选))
- send()
属性:
-
onreadystatechange
可以在代码中为它赋值一个函数
-
readyState
返回一个0-4的值,用来表示状态码
-
status
返回HTTP状态码
-
responseText
当请求成功时,该属性会包含作为文本的响应体
属性的值可以是一个函数!因为JavaScript中的含糊也是一类对象。对象是一类数据,因此它可以被赋值给一个变量(属性),修改和传递
对象的序列化和反序列化:
// JSON响应的反序列化
var my0bject = JSON.parse(myXMLHttpRequest.reponseText);
// 对象的序列化
var myJSON = JSON.stringify(my0bject);
建立一个JSON请求并发送:
myXMLHttpRequest.open("GET", url, true);
myXMLHttpRequest.send();
JSON-P
JSON-P是指带有padding(内联)的JSON。可通过JSON-P绕过同源策略。因为scipt
标签不受同源策略影响,以从不同域名的服务器上请求JSON