JSON是用于存储和传输数据的格式,通常用于服务端向网页传递数据
什么是JSON?
JSON英文全称JavaScript Object
Notation(JavaScript对象表示法),是一种轻量级的用于存储和交换文本信息的语法,被设计用于可读的数据交换,类似XML,但比XML更小、更快,JSON具有自我描述性,更易理解
JSON简介
JSON是从JavaScript脚本语言中演变而来,使用Javascript语法来描述数据对象,文件名扩展是.json,但是JSON格式仅仅是一个文本,仍然独立于语言和平台。JSON解析器和JSON库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON
JSON使用范围
JSON格式可以用于通过网络连接序列化和传输结构化数据,用于编写基于JavaScript应用程序,包括浏览器扩展和网站。JSON主要用于在服务器和Web应用程序之间传输数据,Web服务和APIs可以使用JSON格式提供公用数据,还可以用于现代编程语言中
JSON语法
JSON的语法基本上可以视为JavaScript语法的一个子集,包括以下内容:
数据使用名/值对表示
使用大括号保存对象,每个名称后面跟着一个':'(冒号),名/值对使用,(逗号)分割
使用方括号保存数组,数组值使用,(逗号)分割
{
"book": [
{
"id":"01",
"language":"Java",
"edition":"third",
"author": "HerbertSchildt"
},
{
"id":"07",
"language":"C++",
"edition":"second"
"author":"E.Balagurusamy"
}]
}
JSON支持以下两种数据结构:
名/值对集合: 这一数据结构由不同的编程语言支持
有序的值列表: 包括数组,列表,向量或序列等等
JSON语法规则
JSON语法是JavaScript对象语法的子集
数据在名称/值对中
数据由逗号分隔
花括号保存对象
方括号保存数组
JSON名称/值对
JSON数据的书写格式是:名称/值对
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
{"firstName":"John","lastName":"Doe"}
等价于这条JavaScript语句:
firstName = "John", lastName ="Doe"}
JSON值
JSON值可以是:
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true或false)
数组(在方括号中)
对象(在花括号中)
null
JSON对象
JSON对象在花括号中书写,对象可以包含多个名称/值对
JSON数组
JSON数组在方括号中书写,数组可包含多个对象
"employees":[
{"firstName":"John","lastName":"Doe"},
{"firstName":"Anna","lastName":"Smith"},
{"firstName":"Peter","lastName":"Jones"}
]
JSON使用JavaScript语法
因为JSON使用JavaScript语法,所以无需额外的软件就能处理JavaScript中的JSON。JavaScript程序使用内建的eval()函数,用JSON数据来生成原生的JavaScript对象。
通过JavaScript,您可以创建一个对象数组,并像上面代码那样赋值。然后像这样访问JavaScript对象数组中的第一项
employees[0].lastName;
返回的内容是:
Doe
也可以像这样修改数据:
employees[0].firstName= "Jonatan";
JSON文件
JSON文件的文件类型是".json"
JSON文本的MIME类型是"application/json"
JSON使用
把JSON文本转换为JavaScript对象
JSON最常见的用法之一,是从web服务器上读取JSON数据(作为文件或作为HttpRequest),将JSON数据转换为JavaScript对象,然后在网页中使用该数据。
简单起见,我们直接设置JSON字符串:
首先,创建JavaScript字符串,字符传为JSON格式的数据:
var text = '{"employees" : [' +
'{"firstName":"John" , "lastName":"Doe"},' +
'{"firstName":"Anna" , "lastName":"Smith"},' +
'{"firstName":"Peter" ,"lastName":"Jones" } ]}';
由于JSON语法是JavaScript语法的子集,JavaScript函数eval()可用于将JSON文本转换为JavaScript对象
eval()函数使用的是JavaScript编译器,可解析JSON文本,然后生成JavaScript对象。必须把文本包围在括号中,这样才能避免语法错误:
var obj = eval("(" + txt +")");
在网页中使用JavaScript对象:
First Name:
Last Name:
document.getElementById("fname").innerHTML =obj.employees[1].firstName
document.getElementById("lname").innerHTML =obj.employees[1].lastName
JSON解析器
eval()函数可编译并执行任何JavaScript代码,这隐藏了一个潜在的安全问题。使用JSON解析器将JSON转换为JavaScript对象是更安全的做法。JSON解析器只能识别JSON文本,而不会编译脚本。在浏览器中,提供了原生的JSON支持,而且JSON解析器的速度更快。较新的浏览器和最新的ECMAScript
(JavaScript)标准中均包含了原生的对JSON的支持
JSONP教程
Jsonp(JSON with Padding)是json的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据
为什么我们从不同的域(网站)访问数据需要一个特殊的技术(JSONP )呢?这是因为同源策略。
同源策略,是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript的浏览器都会使用这个策略
JSONP应用
服务端JSONP格式数据
如客户想访问:
/try/ajax/jsonp.php?jsonp=callbackFunction,
假设客户期望返回JSON数据:["customername1","customername2"]。
真正返回到客户端的数据显示为:
callbackFunction(["customername1","customername2"])。
服务端文件jsonp.php代码为:
header('Content-type: application/json');//获取回调函数名
$jsoncallback = htmlspecialchars($_REQUEST['jsoncallback']); //json数据$json_data ='["customername1","customername2"]'; //输出jsonp格式的数据echo$jsoncallback . "(" . $json_data. ")";
?>
客户端实现callbackFunction函数
functiononCustomerLoaded(result, methodName){
var html = '
';
for(var i = 0; i < result.length;i++){
html += '
' + result[i] +'
';
}
html += '';
document.getElementById('divCustomers').innerHTML= html;
}
以上代码可以使用jQuery代码实现:
$.getJSON("/try/ajax/jsonp.php?jsoncallback=?",function(data) {
var html = '
';
for(var i = 0; i < data.length; i++){
html += '
' + data[i] +'
';
}
html += '';
$('#divCustomers').html(html);
});