PHP JSON(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在Web开发中,数据的传输与交互是核心环节。PHP作为一种广泛使用的服务器端语言,与轻量级数据交换格式JSON的结合,构成了现代Web应用开发的重要技术栈。无论是构建RESTful API、处理前端请求,还是实现跨平台数据共享,掌握PHP对JSON的操作能力都是开发者必须具备的技能。本文将从基础概念到实战案例,系统讲解如何高效使用PHP处理JSON数据。


JSON基础:结构与语法解析

什么是JSON?

JSON(JavaScript Object Notation)是一种基于文本的数据交换格式,其语法简洁且易于阅读。想象它像一张“数字化的快递单”:每个键(key)对应一个地址,每个值(value)则是包裹的内容。例如:

{
    "name": "Alice",
    "age": 28,
    "hobbies": ["reading", "coding"],
    "is_student": false
}
  • 核心结构:由键值对(Key-Value)组成,用花括号 {} 包裹。
  • 数据类型:支持字符串(String)、数字(Number)、布尔值(Boolean)、数组(Array)、对象(Object)及null

JSON与XML的对比

若将XML比作“精装书”,其标签冗长且需严格闭合;而JSON则像“便签纸”,以更轻量的语法传递相同信息。例如:
| XML格式 | JSON格式 |
|---------|----------|
| <user><name>Alice</name><age>28</age></user> | {"name": "Alice", "age": 28} |


PHP内置函数详解

PHP提供了两个核心函数json_encode()json_decode(),可实现JSON与PHP数据结构的双向转换。

1. 将PHP数据转为JSON:json_encode()

此函数将数组或对象转换为JSON字符串。例如:

$data = array(  
    "name" => "Bob",  
    "skills" => array("PHP", "JavaScript")  
);  

$json = json_encode($data);  
// 输出结果:{"name":"Bob","skills":["PHP","JavaScript"]}  

常用参数配置

通过第二个参数可控制编码行为:
| 参数常量 | 作用 |
|----------|------|
| JSON_PRETTY_PRINT | 格式化输出,增加缩进与换行 |
| JSON_UNESCAPED_UNICODE | 禁用Unicode转义,直接输出中文 |
| JSON_FORCE_OBJECT | 强制将关联数组转为JSON对象而非数组 |

2. 将JSON转为PHP数据:json_decode()

此函数解析JSON字符串为PHP变量。例如:

$json_str = '{"country": "China", "capital": "Beijing"}';  
$result = json_decode($json_str);  

echo $result->country; // 输出 "China"  

关键参数:assoc

通过设置$assoc = true,可将JSON对象转为关联数组:

$array_result = json_decode($json_str, true);  
echo $array_result['capital']; // 输出 "Beijing"  

实战案例:从API获取并处理JSON数据

案例1:调用天气API并解析响应

假设需从第三方天气API获取数据,PHP代码示例:

// 发送HTTP GET请求  
$url = "https://api.weather.com/data?city=Shanghai";  
$response = file_get_contents($url);  

// 解析JSON响应  
$weather_data = json_decode($response, true);  

// 输出温度信息  
echo "当前温度:" . $weather_data['main']['temp'] . "℃";  

案例2:将数据库查询结果转为JSON输出

在Web应用中,常需将MySQL查询结果以JSON格式返回给前端:

// 连接数据库并执行查询  
$conn = mysqli_connect("localhost", "user", "pass", "mydb");  
$result = mysqli_query($conn, "SELECT id, name FROM users");  

// 将结果转为数组  
$users = array();  
while ($row = mysqli_fetch_assoc($result)) {  
    $users[] = $row;  
}  

// 输出JSON格式数据  
header('Content-Type: application/json');  
echo json_encode($users, JSON_UNESCAPED_UNICODE);  

常见问题与解决方案

问题1:JSON解析失败(json_last_error()

json_decode()返回null时,需检查错误原因:

$json = '{"invalid key}'; // 键名未加引号  
$data = json_decode($json);  
if ($data === null) {  
    $error = json_last_error_msg();  
    echo "解析错误:$error"; // 输出 "Syntax error"  
}  

问题2:对象与数组的转换混淆

若JSON中包含嵌套对象,需注意访问方式:

$json = '{"profile": {"city": "Shenzhen"}}';  
$obj = json_decode($json);  
echo $obj->profile->city; // 正确访问方式  

$array = json_decode($json, true);  
echo $array['profile']['city']; // 正确访问方式  

进阶技巧:处理复杂场景

1. 自定义JSON编码逻辑

通过json_encode()JSON_OBJECT_AS_ARRAY参数,可控制对象转数组的行为。例如:

class User {  
    public $name = "John";  
    public $age = 30;  
}  

$user = new User();  
echo json_encode($user, JSON_FORCE_OBJECT); // 输出标准JSON对象  

2. 处理嵌套JSON结构

对于多层嵌套数据,使用循环遍历:

$data = json_decode($json_str);  
foreach ($data->categories as $category) {  
    foreach ($category->products as $product) {  
        echo $product->name;  
    }  
}  

3. 与HTTP客户端结合

使用Guzzle库发送带JSON数据的POST请求:

use GuzzleHttp\Client;  

$client = new Client();  
$response = $client->post('https://api.example.com/submit', [  
    'json' => ['username' => 'test_user', 'password' => '123456']  
]);  

结论

通过本文的学习,开发者可以系统掌握PHP处理JSON数据的核心方法与实战技巧。从基础语法到高级应用场景,PHP与JSON的结合不仅简化了数据交互流程,还为构建高效、可维护的Web应用提供了强大支持。建议读者通过以下步骤深化理解:

  1. 使用json_encode()json_decode()重构现有代码中的数据处理逻辑
  2. 设计一个包含用户注册与数据返回的完整JSON API
  3. 探索json_last_error()在异常处理中的高级应用

掌握PHP与JSON的协同能力,是迈向专业后端开发的关键一步。持续实践与项目应用,将助你快速成长为具备全栈视野的开发者。

最新发布