0

0

PHP中解析与遍历JSON数据:从API响应中高效提取信息及错误排查

霞舞

霞舞

发布时间:2025-11-28 11:44:02

|

883人浏览过

|

来源于php中文网

原创

php中解析与遍历json数据:从api响应中高效提取信息及错误排查

本教程旨在指导PHP开发者如何高效地解析来自API的JSON数据,将其转换为PHP可操作的数组或对象,并从中提取特定字段。文章将详细介绍`json_decode()`函数的使用、数据遍历方法,并重点强调JSON格式验证及利用`json_last_error()`进行错误诊断的关键步骤,以避免常见的“Array to String conversion”等问题。

在现代Web开发中,与第三方API交互是常见的任务,而API通常以JSON(JavaScript Object Notation)格式返回数据。要在PHP应用程序中处理这些数据,首先需要将JSON字符串转换为PHP能够识别的数据结构(数组或对象),然后才能进行遍历和信息提取。

1. JSON字符串到PHP数组/对象的转换

PHP提供了一个内置函数json_decode(),用于将JSON格式的字符串解码为PHP变量。

函数签名:mixed json_decode ( string $json [, bool $assoc = FALSE [, int $depth = 512 [, int $options = 0 ]]] )

立即学习PHP免费学习笔记(深入)”;

  • $json: 待解码的JSON字符串。
  • $assoc: 可选参数。如果设置为true,json_decode()将返回关联数组;如果设置为false(默认值),将返回对象。
  • $depth: 可选参数。指定JSON的最大嵌套深度。
  • $options: 可选参数。位掩码,用于指定解码选项。

通常,为了方便地通过键名访问数据,我们会将$assoc参数设置为true,使json_decode()返回关联数组。

示例JSON数据: 假设我们从航班API获取到以下JSON响应。为了演示,我们先修正原问题中略有格式错误的部分。

{
    "pagination": {
        "limit": 1,
        "offset": 0
    },
    "data": [
        {
            "flight_date": "2021-12-19",
            "flight_status": "scheduled",
            "departure": {
                "airport": "Suvarnabhumi International",
                "timezone": "Asia/Bangkok"
            },
            "arrival": {
                "airport": "Seoul (Incheon)",
                "timezone": "Asia/Seoul",
                "iata": "ICN"
            },
            "airline": {
                "name": "Delta Air Lines"
            },
            "flight": {
                "number": "7918",
                "iata": "DL7918",
                "codeshared": {
                    "airline_name": "korean air",
                    "airline_iata": "ke"
                }
            },
            "aircraft": null,
            "live": null
        },
        {
            "flight_date": "2021-12-20",
            "flight_status": "cancelled",
            "departure": {
                "airport": "Heathrow",
                "timezone": "Europe/London"
            },
            "arrival": {
                "airport": "JFK",
                "timezone": "America/New_York",
                "iata": "JFK"
            },
            "airline": {
                "name": "British Airways"
            },
            "flight": {
                "number": "BA177",
                "iata": "BA177"
            },
            "aircraft": null,
            "live": null
        }
    ]
}

PHP解码示例:

<?php

$jsonString = '{
    "pagination": {
        "limit": 1,
        "offset": 0
    },
    "data": [
        {
            "flight_date": "2021-12-19",
            "flight_status": "scheduled",
            "departure": {
                "airport": "Suvarnabhumi International",
                "timezone": "Asia/Bangkok"
            },
            "arrival": {
                "airport": "Seoul (Incheon)",
                "timezone": "Asia/Seoul",
                "iata": "ICN"
            },
            "airline": {
                "name": "Delta Air Lines"
            },
            "flight": {
                "number": "7918",
                "iata": "DL7918",
                "codeshared": {
                    "airline_name": "korean air",
                    "airline_iata": "ke"
                }
            },
            "aircraft": null,
            "live": null
        },
        {
            "flight_date": "2021-12-20",
            "flight_status": "cancelled",
            "departure": {
                "airport": "Heathrow",
                "timezone": "Europe/London"
            },
            "arrival": {
                "airport": "JFK",
                "timezone": "America/New_York",
                "iata": "JFK"
            },
            "airline": {
                "name": "British Airways"
            },
            "flight": {
                "number": "BA177",
                "iata": "BA177"
            },
            "aircraft": null,
            "live": null
        }
    ]
}';

$data = json_decode($jsonString, true); // 解码为关联数组

// 检查解码是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
    echo "JSON解码错误: " . json_last_error_msg() . PHP_EOL;
    exit;
}

// 打印解码后的数据结构(用于调试)
// print_r($data);

?>

2. 遍历和提取数据

一旦JSON字符串被成功解码为PHP数组(或对象),就可以像操作普通PHP数组一样遍历它并提取所需信息。根据示例JSON结构,航班信息存储在顶层键data下的数组中。

Tome
Tome

先进的AI智能PPT制作工具

下载

我们将提取每个航班的flight_date和出发机场airport。

<?php
// 承接上文的 $data 变量

if (isset($data['data']) && is_array($data['data'])) {
    foreach ($data['data'] as $flight) {
        $flightDate = $flight['flight_date'] ?? 'N/A'; // 使用null合并运算符提供默认值
        $departureAirport = $flight['departure']['airport'] ?? 'N/A';
        $arrivalAirport = $flight['arrival']['airport'] ?? 'N/A';

        echo "航班日期: " . $flightDate . ", 出发机场: " . $departureAirport . ", 到达机场: " . $arrivalAirport . PHP_EOL;
    }
} else {
    echo "未找到航班数据或数据格式不正确。" . PHP_EOL;
}

?>

输出示例:

航班日期: 2021-12-19, 出发机场: Suvarnabhumi International, 到达机场: Seoul (Incheon)
航班日期: 2021-12-20, 出发机场: Heathrow, 到达机场: JFK

3. JSON格式验证与错误处理

在实际应用中,API返回的JSON字符串可能因网络问题、API错误或编码问题而损坏或格式不正确。直接解码这些损坏的JSON会导致json_decode()返回null,进而尝试访问null值时引发“Array to String conversion”或“Undefined index”等错误。

为了避免这种情况,务必在解码后检查JSON是否有效。PHP提供了json_last_error()和json_last_error_msg()函数来获取最后一次JSON操作的错误信息。

错误排查示例: 以下代码演示了如何检查JSON字符串的格式并报告错误。这个例子故意使用一个包含格式错误的JSON字符串,以展示错误检测机制。

<?php

// 包含格式错误的JSON字符串(注意flight键后的逗号和缺失的括号)
$malformedJsonString = '{
  "pagination": {
      "limit": 2,
      "offset": 0,
      "count": 2,
      "total": 315303
  },
  "data": [
      {
          "flight_date": "2021-12-19",
          "flight_status": "scheduled",
          "departure": {
              "airport": "Suvarnabhumi International",
              "timezone": "Asia/Bangkok"
          },
          "arrival": {
              "airport": "Seoul (Incheon)",
              "timezone": "Asia/Seoul"
          },
          "airline": {
              "name": "Delta Air Lines",
              "iata": "DL",
              "icao": "DAL"
          },
          "flight": {
              "number": "7918",
              "iata": "DL7918",
              } // 此处多了一个逗号,且缺少一个闭合大括号
          },
          "aircraft": null,
          "live": null
      }
  ]
}';

echo "尝试解码JSON字符串并检查错误..." . PHP_EOL;

// 尝试解码
$decodedData = json_decode($malformedJsonString, true);

// 检查json_last_error()的返回值
switch (json_last_error()) {
    case JSON_ERROR_NONE:
        echo ' - JSON解码成功,无错误。' . PHP_EOL;
        // 可以在这里处理 $decodedData
        // print_r($decodedData);
        break;
    case JSON_ERROR_DEPTH:
        echo ' - 错误: JSON达到最大堆栈深度。' . PHP_EOL;
        break;
    case JSON_ERROR_STATE_MISMATCH:
        echo ' - 错误: JSON下溢或模式不匹配。' . PHP_EOL;
        break;
    case JSON_ERROR_CTRL_CHAR:
        echo ' - 错误: 发现意外的控制字符。' . PHP_EOL;
        break;
    case JSON_ERROR_SYNTAX:
        echo ' - 错误: JSON语法错误,格式不正确。' . PHP_EOL;
        echo '   详细信息: ' . json_last_error_msg() . PHP_EOL;
        break;
    case JSON_ERROR_UTF8:
        echo ' - 错误: UTF-8字符编码错误,可能编码不正确。' . PHP_EOL;
        break;
    default:
        echo ' - 错误: 未知JSON解码错误。' . PHP_EOL;
        echo '   详细信息: ' . json_last_error_msg() . PHP_EOL;
        break;
}

echo PHP_EOL;

// 另一个正确的JSON字符串示例
$correctJsonString = '{
    "status": "success",
    "message": "Data retrieved successfully."
}';

echo "尝试解码正确的JSON字符串并检查错误..." . PHP_EOL;
$decodedDataCorrect = json_decode($correctJsonString, true);
if (json_last_error() === JSON_ERROR_NONE) {
    echo ' - JSON解码成功,无错误。' . PHP_EOL;
    // print_r($decodedDataCorrect);
} else {
    echo ' - 错误: ' . json_last_error_msg() . PHP_EOL;
}

?>

输出示例:

尝试解码JSON字符串并检查错误...
 - 错误: JSON语法错误,格式不正确。
   详细信息: Syntax error

尝试解码正确的JSON字符串并检查错误...
 - JSON解码成功,无错误。

当遇到JSON语法错误时,json_last_error()会返回JSON_ERROR_SYNTAX。此时,可以利用在线JSON校验工具(如jsonlint.com)来快速定位JSON字符串中的具体语法问题。

注意事项与最佳实践

  1. 始终检查json_decode()的返回值: 如果解码失败,json_decode()会返回null。在尝试访问任何数组元素之前,应检查返回的数据是否为null。结合json_last_error()可以提供更详细的错误原因。
  2. 防御性编程: 在访问深层嵌套的数组元素时,使用isset()或null合并运算符(??,PHP 7+)来检查键是否存在,以避免“Undefined index”警告或错误。
    $flightDate = $flight['flight_date'] ?? 'N/A';
    $departureAirport = $flight['departure']['airport'] ?? 'N/A';
  3. 处理API响应: 当通过cURL等方式从API获取JSON数据时,不仅要检查JSON的有效性,还要检查HTTP状态码(例如,200 OK)以确保请求成功。
  4. 编码问题: 确保JSON字符串的编码是UTF-8。如果不是,可能会遇到JSON_ERROR_UTF8错误。
  5. 内存限制: 对于非常大的JSON文件,json_decode()可能会消耗大量内存。如果遇到内存不足错误,可能需要考虑流式解析或调整PHP的内存限制。

总结

在PHP中处理JSON数据,核心在于json_decode()函数。通过将JSON字符串转换为关联数组,可以方便地遍历和提取所需信息。然而,健壮的代码不仅要能处理有效数据,更要能优雅地处理无效数据。因此,结合json_last_error()进行JSON格式验证和错误排查是至关重要的步骤,它能帮助开发者快速诊断并解决因JSON格式问题导致的运行时错误,从而构建更稳定、可靠的应用程序。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

547

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1030

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1567

2023.10.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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