zoukankan      html  css  js  c++  java
  • 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中都有哪些需要转移的字符呢,有以下几种

    • /(正斜线)
    • (退格符)
    • f(换页符)
    • (制表符)
    • (换行符)
    • (回车符)
    • 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

  • 相关阅读:
    Floyd_Warshall算法
    Bellman_Ford算法
    深度优先搜索
    广度优先搜索
    贪心算法_活动选择
    动态规划_0-1背包问题
    算法导论_动态规划_最长回文子序列
    算法导论_动态规划_最长公共子序列
    动态规划解决分割问题
    2016 Google中国开发者大会游记
  • 原文地址:https://www.cnblogs.com/Jleixin/p/14300213.html
Copyright © 2011-2022 走看看