在 PHP 中处理 JSON:面向初学者的解析与序列化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JSON 与 PHP 简介



JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式,已成为 Web 服务器与客户端之间交互的事实标准。在现代 PHP Web 开发中,您会频繁遇到 JSON:从 API 请求到配置文件,再到结构化数据的存储。



在本文中,我们将探讨在 PHP 中处理 JSON 的两个基本过程:



  • 序列化 — 将 PHP 数组或对象转换为 JSON 字符串(json_encode() 函数)。
  • 解析(反序列化) — 将 JSON 字符串反向转换为 PHP 变量(json_decode() 函数)。


本材料面向初学 PHP 的开发者,因此我们将由浅入深,并提供详细的代码示例。



数据序列化:json_encode() 函数



序列化是将数据从 PHP 内部表示(数组、对象)转换为 JSON 格式字符串的过程。当您需要将数据发送给客户端(浏览器、移动应用)或以通用格式保存到文件/数据库时,这是必要的。



将数组转换为 JSON



最简单的情况是序列化关联数组:



<?php$user = [    "name" => "伊万·彼得罗夫",    "age" => 28,    "email" => "ivan@example.com",    "is_active" => true];

$jsonString = json_encode($user, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);echo $jsonString;?>


执行结果:



{    "name": "伊万·彼得罗夫",    "age": 28,    "email": "ivan@example.com",    "is_active": true}


请注意以下标志:

  • JSON_UNESCAPED_UNICODE — 允许保留西里尔字母(若无此标志,俄文字符将被转换为 \\uXXXX)。
  • JSON_PRETTY_PRINT — 使用缩进格式化输出以提高可读性(有助于调试,但会增加字符串大小)。


将对象转换为 JSON



PHP 对象也可以被序列化。此时仅包含 public 属性:



<?phpclass Product {    public $id;    public $title;    private $secretPrice; // 不会包含在 JSON 中

public function __construct($id, $title, $price) { $this->id = $id; $this->title = $title; $this->secretPrice = $price; }}

$product = new Product(1, "笔记本电脑", 75000);echo json_encode($product, JSON_UNESCAPED_UNICODE);// 输出:{"id":1,"title":"笔记本电脑"}?>


处理嵌套结构



JSON 支持嵌套。任意深度的 PHP 数组都能正确转换:



<?php$data = [    "company" => "TechCorp",    "employees" => [        ["name" => "安娜", "position" => "开发者"],        ["name" => "鲍里斯", "position" => "设计师"]    ],    "address" => [        "city" => "莫斯科",        "street" => "特维尔大街"    ]];

echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);?>


解析 JSON:json_decode() 函数



解析(反序列化)是反向过程:从 JSON 字符串中获取 PHP 可以处理的数据。



获取对象



默认情况下,json_decode() 返回一个 stdClass 类的对象:



<?php$jsonString = '{"name":"伊万·彼得罗夫","age":28,"email":"ivan@example.com"}';$user = json_decode($jsonString);

echo $user->name; // 伊万·彼得罗夫echo $user->age; // 28echo $user->email; // ivan@example.com?>


获取数组



如果传入第二个参数 true,函数将返回一个关联数组:



<                

博客

书籍推荐