{ Hello Magento 2 }

解决 Magento 2 应用问题,更注重深度挖掘。(ง •̀_•́)ง

0%

JSON

JSON (JavaScript Object Notation ,JavaScript 对象表示法),是一种轻量级的数据交换格式,比 xml 更易于解析,更明了。本篇将介绍 JSON 在 JavaScript 和 php 中的使用。 JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 JSON 主要保存两种结构:对象和数组。

对象

1
{ "firstName":"John" , "lastName":"Doe" }

数组

1
2
3
4
5
[
{ "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 对象。必须把文本包围在括号中,这样才能避免语法错误。 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!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() 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!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() 不允许用逗号作为结尾

1
2
3
// both will throw a SyntaxError
JSON.parse("[1, 2, 3, 4, ]");
JSON.parse('{"foo" : 1, }');

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!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 字符串

1
2
3
4
5
6
7
8
9
10
11
<?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
2
3
{"1":"one","2":"two","3":"three"}
["one","two","three"]
{"0":"one","1":"two","2":"three"}

由于 javascript 中是通过对象来实现关联数组的,所以 json_encode() 只将索引数组转为数组格式,而将关联数组转为对象格式。 对象的转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);

输出:

1
{"name":"jone"}

除了公开变量(public),其他东西(常量、私有变量、方法等等)都会遗失。

json_decode()

json_decode() 用于将 JSON 字符串转换成相应的 php 数据结构。

1
2
3
4
5
6
7
8
9
$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

注意点

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

将会返回 null JSON.parse()一样,json_decode() 不允许用逗号作为结尾

参考文档

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