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

PHP函数:使用json_decode()函数解码JSON格式数据

发布时间:2023-06-13 16:47:01

JSON是一种轻量级的数据交换格式,具有简洁、易读、易解析等特点,广泛应用于API接口的数据传输和存储。PHP作为一种流行的Web编程语言,在处理JSON数据时,提供了一种十分便捷的解码方法——json_decode()函数。

一、json_decode()函数基础

json_decode()函数用于将JSON格式的字符串解码为PHP变量。它的语法如下:

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

参数说明:

json_string:待解码的JSON格式字符串。

assoc:可选。若为true,则解码后的JSON数据将以数组形式返回;若为false,则解码后的JSON数据将以对象形式返回。默认为false。

depth:可选。指定解码过程中允许的最大深度。如果超过了指定的深度,则解码将失败并返回null。默认为512。

options:可选。指定JSON解码选项。默认为0。可以使用以下常量:

- JSON_BIGINT_AS_STRING:将大整数作为字符串返回。

- JSON_INVALID_UTF8_IGNORE:在解码时忽略不合法的UTF-8字符。

- JSON_INVALID_UTF8_SUBSTITUTE:在解码时替换不合法的UTF-8字符。

- JSON_OBJECT_AS_ARRAY:在解码时将对象转换为数组。

二、使用json_decode()函数解码JSON格式数据

下面是一个简单的例子,展示如何使用json_decode()函数将JSON格式字符串解码为PHP数组或对象:

<?php

$json_str = '{"name":"Tom","age":20,"gender":"Male"}';

// 解码为对象

$obj = json_decode($json_str);

echo $obj->name; // Tom

echo $obj->age; // 20

echo $obj->gender; // Male

// 解码为数组

$arr = json_decode($json_str, true);

echo $arr['name']; // Tom

echo $arr['age']; // 20

echo $arr['gender']; // Male

?>

在上面的例子中,我们首先定义了一个JSON格式的字符串$json_str,它包含了键为"name"、"age"和"gender"的数据。然后我们调用了json_decode()函数,将其解码为对象和数组,并输出了其相应的属性或元素。

注意,如果JSON格式字符串中包含了Unicode编码字符,需要先进行转义,否则会解码失败。例如,下面的例子中,如果不进行转义,会导致解码失败:

$json_str = '{"name":"\u674e\u5b66\u5b50","age":20,"gender":"Male"}';

// 解码为对象

$obj = json_decode($json_str);

echo $obj->name; // 不输出

// 解码为数组

$arr = json_decode($json_str, true);

echo $arr['name']; // 不输出

为了解决这个问题,我们可以使用PHP内置的stripslashes()函数,对JSON字符串进行转义:

$json_str = '{"name":"\u674e\u5b66\u5b50","age":20,"gender":"Male"}';

// 转义

$json_str = stripslashes($json_str);

// 解码为对象

$obj = json_decode($json_str);

echo $obj->name; // 李学子

// 解码为数组

$arr = json_decode($json_str, true);

echo $arr['name']; // 李学子

三、处理JSON解码错误

当json_decode()函数解码JSON格式字符串时,如果格式不正确,会导致解码失败,返回null。此时,可以使用json_last_error()函数获取解码过程中的错误信息,并根据错误码进行相应的处理。

json_last_error()函数的语法如下:

int json_last_error(void)

该函数无需任何参数,它会返回上次调用json_decode()函数过程中出现的错误码。需要注意的是,如果在调用json_last_error()函数之前没有调用过json_decode()函数,该函数将始终返回JSON_ERROR_NONE(0)。

以下是一些常见的JSON解码错误码及其含义:

- JSON_ERROR_NONE(0):没有错误发生。

- JSON_ERROR_DEPTH(1):到达了最大堆栈深度。

- JSON_ERROR_STATE_MISMATCH(2):状态或模式不匹配,例如缺少大括号、方括号、双引号等。

- JSON_ERROR_CTRL_CHAR(3):遇到了无效的控制字符。

- JSON_ERROR_SYNTAX(4):JSON格式错误,例如缺少逗号、多了逗号、多了大括号等。

- JSON_ERROR_UTF8(5):JSON字符串包含无效的UTF-8字符。

下面是一个例子,展示了如何在解码JSON格式字符串时处理错误:

<?php

$json_str = '{"name":"Tom","age":20,"gender":}';

$data = json_decode($json_str);

if (json_last_error() !== JSON_ERROR_NONE) {

    die('JSON解码失败:' . json_last_error_msg());

}

?>

在上面的例子中,我们自己制造了一个JSON格式字符串,其中"gender"键的值为空,格式不正确。我们使用json_decode()函数解码该字符串,如果解码失败,就使用json_last_error()函数获取错误信息,并输出到屏幕上。

注意,在PHP 7.3或更高版本中,可以使用新的函数json_last_error_msg()获取更加详细的JSON解码错误信息。它的语法如下:

string json_last_error_msg(void)

该函数无需任何参数,它会返回上次调用json_decode()函数过程中出现的错误信息。如果在调用json_last_error_msg()函数之前没有调用过json_decode()函数,该函数将始终返回空字符串。