PHP函数:json_decode()将JSON字符串转为PHP数组或对象详解
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数组或对象,以便使用和处理。
