JSON

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

通常情况下,json_decode() 总是返回一个PHP对象,而不是数组。如果想要强制生成PHP关联数组,json_decode()需要加一个参数 true

注意点

$string = '{"name":"jone",}';
var_dump(json_decode($string));

将会返回 null

JSON.parse()一样,json_decode() 不允许用逗号作为结尾

参考文档

Introducing JSON
JSON 使用
在PHP语言中使用JSON

发表评论

电子邮件地址不会被公开。 必填项已用*标注