PHP 中解析包含嵌套 JSON 字符串的复杂数据结构

花韻仙語
发布: 2025-09-19 13:06:00
原创
465人浏览过

php 中解析包含嵌套 json 字符串的复杂数据结构

本文详细介绍了在 PHP 中如何解析一种特殊的 JSON 数据结构:当一个 JSON 字段的值本身是一个 JSON 字符串时,特别是该字符串代表一个无键的二维数组。通过两次调用 json_decode 函数,并结合 foreach 循环,可以有效地提取并处理这些嵌套数据,实现对复杂 REST API 响应的精准解析。

理解问题:REST API 响应中的嵌套 JSON 字符串

在处理 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 字符串,无法直接通过数组或对象方式访问其内部的数值。这就需要我们采取额外的步骤来正确解析这些嵌套的数据。

解决方案核心:双重 json_decode

PHP 提供了 json_decode() 函数来解析 JSON 字符串。当 json_decode() 函数的第二个参数设置为 true 时,它会将 JSON 对象解析为关联数组,而不是标准对象,这在很多场景下更便于数据访问。针对上述特殊结构,我们需要进行两次 json_decode 操作。

第一步:解析外部 JSON

首先,我们需要对整个 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'] 的值仍然是一个字符串。

第二步:解析内部 JSON 字符串

接下来,我们需要针对 $parsed['data'] 这个字符串进行第二次 json_decode。由于它代表一个二维数组,解码后将得到一个 PHP 的二维数组。

即构数智人
即构数智人

即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

即构数智人 36
查看详情 即构数智人
// 第二次解码,将 '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 变量中存储的就是我们期望的二维数组,可以直接进行遍历和操作。

迭代数据:使用 foreach 循环

一旦 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 | 
登录后复制

注意事项

  1. 错误处理: 在实际应用中,务必对 json_decode() 的返回值进行检查。如果解码失败,json_decode() 会返回 null。可以使用 json_last_error() 和 json_last_error_msg() 函数获取详细的错误信息,以便进行适当的错误处理。
  2. 性能考量: 对于非常大的 JSON 字符串,两次解码会增加处理时间。然而,对于大多数 REST API 响应而言,这种开销通常可以忽略不计。
  3. 数据类型: json_decode() 的第二个参数设置为 true 会将 JSON 对象转换为关联数组。如果希望获取标准对象,可以省略此参数或将其设置为 false。但对于无键的 JSON 数组,无论如何都会解析为 PHP 数组。
  4. 数据一致性: 确保 data 字段内的字符串始终是有效的 JSON 格式。如果其内容不是合法的 JSON 字符串,第二次 json_decode() 将会失败。

总结

通过理解 JSON 数据的嵌套结构以及 json_decode() 函数的工作原理,我们可以有效地处理包含 JSON 字符串值的复杂 JSON 数据。两次调用 json_decode() 是解决这类问题的关键,它将外部结构和内部嵌套的 JSON 字符串分别解析,最终得到可供 PHP 程序直接操作的数组或对象。在实际开发中,结合错误处理机制,可以构建出健壮的数据解析逻辑。

以上就是PHP 中解析包含嵌套 JSON 字符串的复杂数据结构的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号