JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于编程语言的文本格式来存储和传输数据,本质是字符串。
服务器和客户机主要通过JSON格式来进行数据传输。
1. 当服务器需要输出数据时,我们可以使用json_encode()函数将PHP数据转为JSON字符串:
json_encode()函数的语法格式如下:
string json_encode(mixed $value, int $options = 0, int $depth = 512)
其中,$options指定JSON的编码方式,我们可以填写以下数字:
| 选项常量 | 值 | 说明 |
|---|---|---|
JSON_HEX_TAG | 1 | 将 < 和 > 转换为 \u003C 和 \u003E |
JSON_HEX_AMP | 2 | 将 & 转换为 \u0026 |
JSON_HEX_APOS | 4 | 将 ' 转换为 \u0027 |
JSON_HEX_QUOT | 8 | 将 " 转换为 \u0022 |
JSON_UNESCAPED_UNICODE | 256 | 不转义中文等Unicode字符(最常用) |
JSON_PRETTY_PRINT | 128 | 格式化输出,便于阅读 |
JSON_UNESCAPED_SLASHES | 64 | 不转义 / |
JSON_NUMERIC_CHECK | 32 | 将数字字符串转为数字 |
JSON_PRESERVE_ZERO_FRACTION | 1024 | 保留浮点数的小数部分 |
第三个参数是JSON编码的最大嵌套深度,防止无限递归或者深度过大,默认值 512 足够应对 99% 的场景。
这里我们可以试着把一个数组打包成JSON:
<?php /* json_encode()函数 */ //1. 准备一个教程名字数组 $arr=['PHP','Java','C语言','算法竞赛','Linux命令']; //2. 通过json_encode()函数对数组进行json打包 $jsonStr=json_encode($arr,128|256,512); echo $jsonStr;//[ "PHP", "Java", "C语言", "算法竞赛", "Linux命令" ] ?>
2. 当服务器接受JSON数据时,我们就需要通过json_decode()函数对JSON数据进行解码:
json_decode()函数的语法格式如下:
mixed json_decode(string $json, bool $assoc = false, int $depth = 512, int $options = 0)
其中,第二个参数$assoc表示是将JSON转数组(true)还是对象(false),第三个参数$depth表示解码深度,第四个参数表示解码方式,解码方式有以下三个选项:
| 选项常量 | 值 | 说明 | PHP版本 |
|---|---|---|---|
JSON_BIGINT_AS_STRING | 2 | 将大整数转为字符串 | 5.4+ |
JSON_OBJECT_AS_ARRAY | 1 | 将对象转为数组 | 5.4+ |
JSON_THROW_ON_ERROR | 4194304 | 解码错误时抛出异常 | 7.3+ |
JSON_INVALID_UTF8_IGNORE | 1048576 | 忽略无效UTF-8字符 | 7.2+ |
JSON_INVALID_UTF8_SUBSTITUTE | 2097152 | 替换无效UTF-8字符 | 7.2+ |
比如这里我们试着为一个JSON字符串进行对象(默认是对象)解码:
<?php
// JSON 字符串
$jsonStr = '{"brand":"Dotcpp编程","website":"dotcpp.com"}';
// 解码为对象(默认)
$obj = json_decode($jsonStr);
echo $obj->brand . "<br>"; // 输出:Dotcpp编程
echo $obj->website . "<br>"; // 输出:dotcpp.com
?>总结:PHP通过json_encode()将数据编码为JSON字符串用于输出或存储,通过json_decode()将JSON字符串解码为PHP数据结构进行处理。这是现代Web开发中进行前后端数据交换的核心技术。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程