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中的布尔类型

布尔类型就是truefalse

{
	"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

posted @ 2021-01-19 21:30  怪味巧克力  阅读(170)  评论(0编辑  收藏  举报