转自:http://blog.sina.com.cn/s/blog_7eeb1c4d0100zcas.html
JSON介绍
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,是JavaScript语言的一个子集。由于JSON 天生是为JavaScript 准备的,所以对于JS有很好的适用。
JSON与XML具有相同特性,但相较于XML更易于人的阅读和编写,同时也易于机器解析和生成。JSON比XML数据传输的有效性要高很多。JSON 为 Web 应用开发者提供了另一种数据交换格式,减少了XML解析带来的性能问题和兼容性问题。
一、JSON建构于两种结构:
1. “名称/值”对的集合。不同的语言中,它被理解为对象,纪录,结构,字典,哈希表,有键列表,或者关联数组。
一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
如:
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
2. 值的有序列表。在大部分语言中,它被理解为数组。
一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
如:
[
{
"UserID":11,
"Name":
{
"FirstName":"Truly",
"LastName":"Zhu"
},
"Email":zhuleipro@hotmail.com
},
{
"UserID":12,
"Name":
{
"FirstName":"Jeffrey",
"LastName":"Richter"
},
}
]
和 XML 一样,JSON 也是基于纯文本的数据格式。JSON 的数据格式非常简单,可以用 JSON传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的 Object 对象,这些结构可以嵌套。
二、JSON的优点
1. 轻量级的数据交换格式:
同样的数据,代码比较少,用起来比较方便。
2. 读写更加容易。
格式简单,示例:
{
“small”,
“medium”,
“large”
]
3. 易于机器的解析和生成。
在JavaScript中,JSON被理解为对象。
4. 便于JavaScript的解析。
例如JavaScript可以用eval直接将JSON变为一个对象来通过key来调用value属性值。
5. JSON支持多语言。
包括:ActionScript, C, C#, ColdFusion, E, Java, JavaScript, ML, Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Lua.
三、JSON缺点:
JSON的缺点也就是XML的优点,因为它的轻量级,其只能表述数据,而不能表述数据的格式。
四、JSON 数据格式解析
(一)JavaScript 处理 JSON 数据
(1)由于JSON是JavaScript的一个子集,因此可以直接在JavaScript中声明一个JSON数据对象。
var myJson = {
"name":"Michael",
"address":
{
"city":"Beijing",
"street":"Chaoyang Road",
"postcode":100025
}
}
(2)利用JQuery函数.getJson()解析JSON文件:
比如json.json放:
[
{
"name":"xujun",
"sex":"男",
"home":"nanjing"
},
{
"name":"jack",
"sex":"男",
"home":"beijing"
}
]
json.html文件里放:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script src="jquery.min.js"></script>
<script>
$(document).ready(function()
{
$.getJSON("json.js", function(json)
{
alert("JSON Data: " + json[0]['name']);
});
});
</script>
</head>
<body>
</body>
</html>
运行弹出;
JSON Data: xujun
取JSON返回的数组中的第一组中的name的值。
(3)利用AJAX在回传数据时,用js的eval_r()函数或jquery的parseJSON()函数将string类型转换成object类型。
用Ajax读取JSON格式的数据,需要先用XMLHttpRequest对象的responseText属性读取,然后再用eval_r()构造返回JSON对象的方法,创建JSON对象。
var req = new XMLHttpRequest();
……
var jsondata = eval_r(‘(' + req.responseText + ‘)');
或
(4)利用JSON官方网站提供的JSON解析器和字符转换器json.js中的方法parse(),从一个字符串中解析出JSON对象。
var
var jsondata = JSON.parse(str);
通过引入json.js调用toJSONString()和JSON.stringify()来进行转换。
(1)
示例:
var
doc[0]='0';
doc[1]='1';
document.write(doc.toJSONString())
结果是["0","1"]
(2)
官方定义:JSON.stringify(value, replacer, space)
value 转换对象,通常情况下是对象或是数组
replacer [可选]转换过程的特殊处理,可以是函数或字符串数组
space [可选]设置缩进符
使用示例:
//Example:
text = JSON.stringify(['e', {pluribus: 'unum'}]);
// text is '["e",{"pluribus":"unum"}]'
text = JSON.stringify(['e', {pluribus: 'unum'}], null, 't');
// text is '[nt"e",nt{ntt"pluribus": "unum"nt}n]'
text = JSON.stringify([new Date()], function (key, value) {
return this[key] instanceof Date ?'Date(' + this[key] + ')': value;});
JSON搭建了客户端Javascirpt和服务器端PHP的交互桥梁。
PHP生成JSON后的字符串,然后把这个字符串传给前台JavaScript,Javascirpt就可以很容易的将其反JSON然后应用。
PHP5.2开始内置了JSON的支持。PHP中与JSON直接相关的函数只有json_encode和json_decode。
1. json_encode
json_encode():对变量进行 JSON 编码。
(1)PHP支持两种数组,一种是只保存"值"(value)的索引数组(indexed array),另一种是保存"名值对"(name/value)的关联数组(associative array)。
由于JavaScript不支持关联数组,所以json_encode()只将索引数组转为数组格式,而将关联数组转为对象格式。
比如,现在有一个索引数组
$arr = Array('one', 'two', 'three');
echo json_encode($arr);
结果为:
["one","two","three"]
如果将它改为关联数组:
$arr = Array('1'=>'one', '2'=>'two', '3'=>'three');
结果就变了:
{"1":"one","2":"two","3":"three"}
注意,数据格式从"[]"(数组)变成了"{}"(对象)。
(2)将类转换成JSON数据
class Foo {
const ERROR_CODE = '404';
public $public_ex = 'this is public';
private $private_ex = 'this is private!';
protected $protected_ex = 'this should be protected';
public function getErrorCode() {
return self::ERROR_CODE;
}
}
现在,对这个类的实例进行JSON转换:
$foo = new Foo;
$foo_json = json_encode($foo);
echo $foo_json;
输出结果是
{"public_ex":"this is public"}
可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。
注:json_encode只能接受UTF-8
2. json_decode
json_decode():接受一个 JSON 格式的字符串并且把它转换为 PHP 变量。
该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子:
$json = '{"foo": 12345}';
$obj = json_decode($json);
print $obj->{'foo'}; // 12345
通常情况下,json_decode()总是返回一个PHP对象,而不是数组。比如:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));// var_dump
结果就是生成一个PHP对象:
object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
如果想要强制生成PHP关联数组,json_decode()需要加一个参数true:
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json),true);
结果就生成了一个关联数组:
array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
参考:
http://www.111cn.net/wy/jquery/34694.htm
http://www.okajax.com/a/200905/php_json.html
http://www.ruanyifeng.com/blog/2011/01/json_in_php.html
http://blog.csdn.net/syhhl007/article/details/1729363
http://hi.baidu.com/yh1350/blog/item/de6d3b16318aa2184a90a7d0
http://www.json.org/json-zh.html
http://php.net/manual/zh/ref.json.php
http://www.cnblogs.com/lbk/archive/2006/11/17/563385.html