
在处理 REST API 响应时,我们有时会遇到一种特殊的数据格式:JSON 结构中的某个字段,其值不是一个简单的字符串、数字或布尔值,而是一个被引号包裹的、表示另一个 JSON 结构的字符串。例如,以下 JSON 数据中,data 字段的值即为一个 JSON 字符串,它代表一个无键的二维数组:
{
"time": 20211101,
"data": " [[1630454700,0.01823,0.01823,0.01823,0.01823,5366.009589], [1630461840,0.01876,0.01877,0.01876,0.01877,5713.905167], [1630462080,0.01877,0.01877,0.01877,0.01877,1039.957378], [1630477560,0.01777,0.01776,0.01778,0.01779,1000.000000]]"
}直接对这样的数据进行一次 json_decode 操作后,data 字段的值仍然是一个普通的 PHP 字符串,无法直接通过数组或对象方式访问其内部的数值。这就需要我们采取额外的步骤来正确解析这些嵌套的数据。
PHP 提供了 json_decode() 函数来解析 JSON 字符串。当 json_decode() 函数的第二个参数设置为 true 时,它会将 JSON 对象解析为关联数组,而不是标准对象,这在很多场景下更便于数据访问。针对上述特殊结构,我们需要进行两次 json_decode 操作。
首先,我们需要对整个 REST API 响应字符串进行第一次 json_decode,将其转换为 PHP 数组或对象。
立即学习“PHP免费学习笔记(深入)”;
$text = '{ "time":20211101, "data":" [[1630454700,0.01823,0.01823,0.01823,0.01823,5366.009589], [1630461840,0.01876,0.01877,0.01876,0.01877,5713.905167], [1630462080,0.01877,0.01877,0.01877,0.01877,1039.957378], [1630477560,0.01777,0.01776,0.01778,0.01779,1000.000000]]" }';
// 第一次解码,将整个JSON字符串解析为PHP关联数组
$parsed = json_decode($text, true);
// 此时 $parsed 结构大致如下:
// [
// 'time' => 20211101,
// 'data' => ' [[1630454700,0.01823,0.01823,0.01823,0.01823,5366.009589], ...]' // 注意,data仍然是一个字符串
// ]经过第一次解码,$parsed['data'] 的值仍然是一个字符串。
接下来,我们需要针对 $parsed['data'] 这个字符串进行第二次 json_decode。由于它代表一个二维数组,解码后将得到一个 PHP 的二维数组。
// 第二次解码,将 'data' 字段的值(一个JSON字符串)解析为PHP二维数组 $data = json_decode($parsed['data'], true); // 此时 $data 结构大致如下: // [ // [1630454700, 0.01823, 0.01823, 0.01823, 0.01823, 5366.009589], // [1630461840, 0.01876, 0.01877, 0.01876, 0.01877, 5713.905167], // ... // ]
现在,$data 变量中存储的就是我们期望的二维数组,可以直接进行遍历和操作。
一旦 data 字段被正确解析为 PHP 的二维数组,我们就可以使用嵌套的 foreach 循环来遍历其中的每一个子数组和每一个值。
foreach ($data as $row) {
echo("| "); // 打印行开始标记
foreach ($row as $val) {
echo("$val | "); // 打印每个值
}
echo("\n"); // 换行
}将上述步骤整合起来,完整的 PHP 代码如下:
<?php
$text = '{ "time":20211101, "data":" [[1630454700,0.01823,0.01823,0.01823,0.01823,5366.009589], [1630461840,0.01876,0.01877,0.01876,0.01877,5713.905167], [1630462080,0.01877,0.01877,0.01877,0.01877,1039.957378], [1630477560,0.01777,0.01776,0.01778,0.01779,1000.000000]]" }';
// 第一次解码:解析外部JSON,将data字段的值作为字符串保留
$parsed = json_decode($text, true);
// 检查第一次解码是否成功且 'data' 键存在
if (json_last_error() !== JSON_ERROR_NONE || !isset($parsed['data'])) {
die("Error decoding outer JSON or 'data' key missing: " . json_last_error_msg());
}
// 第二次解码:解析 'data' 字段中的JSON字符串
$data = json_decode($parsed['data'], true);
// 检查第二次解码是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
die("Error decoding inner JSON string: " . json_last_error_msg());
}
// 遍历解析后的二维数组
foreach ($data as $row) {
echo("| ");
foreach ($row as $val) {
echo("$val | ");
}
echo("\n");
}
?>执行上述代码将输出以下格式的数据:
| 1630454700 | 0.01823 | 0.01823 | 0.01823 | 0.01823 | 5366.009589 | | 1630461840 | 0.01876 | 0.01877 | 0.01876 | 0.01877 | 5713.905167 | | 1630462080 | 0.01877 | 0.01877 | 0.01877 | 0.01877 | 1039.957378 | | 1630477560 | 0.01777 | 0.01776 | 0.01778 | 0.01779 | 1000 |
通过理解 JSON 数据的嵌套结构以及 json_decode() 函数的工作原理,我们可以有效地处理包含 JSON 字符串值的复杂 JSON 数据。两次调用 json_decode() 是解决这类问题的关键,它将外部结构和内部嵌套的 JSON 字符串分别解析,最终得到可供 PHP 程序直接操作的数组或对象。在实际开发中,结合错误处理机制,可以构建出健壮的数据解析逻辑。
以上就是PHP 中解析包含嵌套 JSON 字符串的复杂数据结构的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号