欢迎访问宙启技术站
智能推送

PHP函数:json_decode()将JSON字符串转为PHP数组或对象详解

发布时间:2023-06-23 12:38:25

JSON是一种轻量级的数据交换格式,因其简单易懂、易于解析等优点,已成为Web服务中经常使用的数据格式之一。在PHP中,可以通过json_decode()将JSON格式的字符串转为PHP数组或对象。

json_decode()函数的使用:

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

参数说明:

- $json:要解码的JSON格式的字符串。

- $assoc:可选参数。默认为false。当设置为true时,返回的是关联数组;当设置为false时,返回的是对象。

- $depth:可选参数。设置递归深度。默认为512。

- $options:可选参数。设置解码选项。默认为0。

返回值:成功时返回解码后的PHP数组或对象,失败时返回null。

示例:

$json_str = '{"name":"jack","age":18}';
$arr = json_decode($json_str, true);
var_dump($arr); //outputs: array(2) { ["name"]=> string(4) "jack" ["age"]=> int(18) }

$obj = json_decode($json_str);
var_dump($obj); //outputs: object(stdClass)#1 (2) { ["name"]=> string(4) "jack" ["age"]=> int(18) }

在以上示例中,$json_str是一个JSON格式的字符串,使用json_decode()函数将其解析成了一个PHP数组和一个PHP对象。

接下来,我们来详细解释json_decode()函数各个参数的作用。

1. $json

这个参数是必须要传递的,它指定要解析的JSON格式的字符串。可以是一个JSON对象、数组、字符串、数字、布尔类型或null。

注意:当传递的不是一个合法的JSON格式的字符串时,json_decode()函数会返回null。

同时,$json参数的内容必须是UTF-8编码的,否则解析会出现错误。

下面是一个传递了错误的JSON字符串的例子:

$json_str = '{"name":"jack","age":18}';
$json_str_error = '{"name":"jack","age":}';
$arr = json_decode($json_str, true);
$arr_error = json_decode($json_str_error, true);
var_dump($arr); //outputs: array(2) { ["name"]=> string(4) "jack" ["age"]=> int(18) }
var_dump($arr_error); //outputs: null

由于$json_str_error中的age字段的值缺失,导致解析出错,返回了null。

2. $assoc

这个参数是可选的,默认值为false。当其设置为true时,返回的是关联数组;当设置为false时,返回的是对象。

下面是一个例子:

$json_str = '{"name":"jack","age":18}';
$arr = json_decode($json_str, true);
$obj = json_decode($json_str);
var_dump($arr); //outputs: array(2) { ["name"]=> string(4) "jack" ["age"]=> int(18) }
var_dump($obj); //outputs: object(stdClass)#1 (2) { ["name"]=> string(4) "jack" ["age"]=> int(18) }

在这个例子中,$json_str被解析为了一个包含name和age字段的JSON对象。当设置$assoc参数为true时,被解析为关联数组$arr;当设置为false时,被解析为对象$obj。

当然,对于关联数组和对象,可以使用foreach()循环来遍历取得每个字段的值。

3. $depth

这个参数是可选的,主要用于防止递归过深的情况发生,避免内存溢出等问题。

默认情况下,$depth的值是512。如果JSON对象的嵌套层次超过了这个值,就会返回null。

例如:

$json_str = '{"name":"jack","age":18,"friends":[{"name":"Jim"},{"name":"Tom"},{"name":"Bob"}]}';
$obj = json_decode($json_str, false, 2);
var_dump($obj); //outputs: null

这个例子中的JSON对象有3层嵌套,当设置$depth参数为2时,解析失败,返回了null。

4. $options

这个参数是用来设置解码选项的,主要有以下两个选项:

- JSON_BIGINT_AS_STRING:将超出 PHP_INT_MAX 的大整数转换为字符串。

- JSON_OBJECT_AS_ARRAY:将 JSON 对象解码为数组而不是标准的 PHP object 类。

例如:

$json_str = '{"id": 9223372036854775807}';
echo json_decode($json_str)->id; //outputs: -1
echo json_decode($json_str, false, 512, JSON_BIGINT_AS_STRING)->id; //outputs: 9223372036854775807

在以上例子中,$json_str中的id字段的值超过了PHP_INT_MAX值,如果直接解析会出现解析错误的情况。使用JSON_BIGINT_AS_STRING选项,可以将其解析为字符串类型的值。

另外,使用JSON_OBJECT_AS_ARRAY选项,可以将解析的JSON对象转化为数组,例如:

$json_str = '{"name":"jack","age":18}';
$arr = json_decode($json_str, true, 512, JSON_OBJECT_AS_ARRAY);
var_dump($arr); //outputs: array(2) { ["name"]=> string(4) "jack" ["age"]=> int(18) }

以上就是json_decode()函数的详细介绍,通过这个函数,可以将JSON格式的字符串快速、准确地转化为PHP数组或对象,以便使用和处理。