JSON (JavaScript Object Notation ,JavaScript 对象表示法),是一种轻量级的数据交换格式,比 xml 更易于解析,更明了。本篇将介绍 JSON 在 JavaScript 和 php 中的使用。
JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
JSON 主要保存两种结构:对象和数组。
对象
{ "firstName":"John" , "lastName":"Doe" }
数组
[
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName": "Carter" }
]
注意点
JSON 的键必须使用双引号,值如果是字符串,也必须使用双引号。
数据传输过程中,JSON 是以文本即字符串的形式传输的。所以存在一个 JSON 字符串和 JSON 对象/值转换的问题。
用在 JavaScript 中
eval()
eval()
函数可计算某个字符串,并执行其中的的 JavaScript 代码。
由于 JSON 语法是 JavaScript 语法的子集,JavaScript 函数 eval()
可用于将 JSON 文本转换为 JavaScript 对象。
eval()
函数使用的是 JavaScript 编译器,可解析 JSON 文本,然后生成 JavaScript 对象。必须把文本包围在括号中,这样才能避免语法错误。
例如:
<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
<script type="text/javascript">
// case 1
var string = '{ "firstName":"John" , "lastName":"Doe" }';
var obj = eval('(' + string + ')');
alert(obj.firstName);
</script>
</body>
</html>
eval() 函数可编译并执行任何 JavaScript 代码。这隐藏着潜在的安全问题。
JSON 解析器
JSON 解析器只能识别 JSON 文本,而不会编译脚本,JSON 解析器速度更快,也更安全。
但是 JSON 解析器并不是一开始就由浏览器实现了,他存在兼容性问题。兼容性情况请参考 JSON.parse()
例如:
<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
<script type="text/javascript">
// case 2
var string = '{ "firstName":"John" , "lastName":"Doe" }';
var obj = JSON.parse(string);
alert(obj.firstName);
</script>
</body>
</html>
JSON.parse() 不允许用逗号作为结尾
// both will throw a SyntaxError
JSON.parse("[1, 2, 3, 4, ]");
JSON.parse('{"foo" : 1, }');
例如:
<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
<script type="text/javascript">
// case 3
var obj = { "firstName":"John" , "lastName":"Doe" };
var string = JSON.stringify(obj);
console.log(string);
console.log(obj);
</script>
</body>
</html>
JSON.stringify
将 JS 对象转换成字符串。
使用其他 js 包
可查阅官方文档 Introducing JSON
用在 php 中
php 从 5.2 开始提供对 JSON 的原生支持。
json_encode()
json_encode()
用于将数组和对象转换成 json 字符串
<?php
$arr1 = ['1' => 'one', '2' => 'two', '3' => 'three'];
echo json_encode($arr1);
echo '<br/>';
$arr2 = ['one', 'two', 'three'];
echo json_encode($arr2);
echo '<br/>';
echo json_encode($arr2, JSON_FORCE_OBJECT);
输出结果:
{"1":"one","2":"two","3":"three"}
["one","two","three"]
{"0":"one","1":"two","2":"three"}
由于 javascript 中是通过对象来实现关联数组的,所以 json_encode() 只将索引数组转为数组格式,而将关联数组转为对象格式。
对象的转换
class Person
{
public $name;
public function hello()
{
echo 'hello,my name is' . $this->name;
}
}
$jone = new Person();
$jone->name = 'jone';
// echo gettype(json_encode($jone));
echo json_encode($jone);
输出:
{"name":"jone"}
除了公开变量(public),其他东西(常量、私有变量、方法等等)都会遗失。
json_decode()
json_decode()
用于将 JSON 字符串转换成相应的 php 数据结构。
$string = '{"name":"jone"}';
$obj = json_decode($string);
var_dump($obj);
// 强制生成关联数组
var_dump(json_decode($string, true));
$string2 = '["one","two","three"]';
var_dump(json_decode($string2));
输出:
通常情况下,json_decode()
总是返回一个PHP对象,而不是数组。如果想要强制生成PHP关联数组,json_decode()
需要加一个参数 true
注意点
$string = '{"name":"jone",}';
var_dump(json_decode($string));
将会返回 null
和 JSON.parse()
一样,json_decode()
不允许用逗号作为结尾