JSON技术解析
什么是 JSON
JSON 全称:JavaScript Object Notation,是一种跨平台通用轻量级文本数据格式,用来存储、传输数据。
特点:所有编程语言都能看懂,PHP/Java/Python/ 前端 JS 全都通用,是现在前后端传数据的统一标准格式。
- 键名必须用双引号包裹,不能单引号
- 数据之间用逗号分隔,最后一项末尾不能加逗号
- 支持 6 种数据类型:字符串、数字、布尔、null、对象、数组
- 标准 JSON 不能写注释
JSON 用来干什么
前后端接口传数据(最主要用途)登录、查询、提交数据,统一用 JSON 收发
配置文件网站配置、小程序配置都常用
.json文件本地存储数据浏览器本地缓存、小程序缓存
和普通文本、表单数据区别
- 普通文字:杂乱无章,程序不好读取
- 表单键值对:只能简单传单个字段
- JSON:结构清晰,能一次性传递复杂多层数据,程序自动解析
与XML区别
JSON = 轻量、简洁、快 → 现代前后端交互首选
XML = 繁琐、笨重、扩展性强 → 老系统 / 企业专用
| 特性 | JSON | XML |
|---|---|---|
| 全称 | JavaScript 对象表示法 | 可扩展标记语言 |
| 语法 | 键值对{"key":"val"},极简 | 自定义标签<key>val</key>,繁琐 |
| 体积 | 无冗余字符,体积小、传输快 | 标签重复,体积大、传输慢 |
| 解析难度 | 原生支持,JS/PHP 一行代码解析 | 需要专门解析器,代码复杂 |
| 数据类型 | 支持数字 / 布尔 / 数组 / 对象 | 所有数据都是字符串,需手动转换 |
| 注释 | 标准格式不支持注释 | 支持<!-- 注释 --> |
| 主要用途 | 前后端接口、API、小程序、APP | 老系统、配置文件、企业级服务 |
| 学习成本 | 极低,5 分钟学会 | 较高,规则复杂 |
代码对照,明显JSON更加轻便和简洁:
JSON------------------ { "user": { "id": 1, "name": "张三", "age": 20 } } XML------------------- <user> <id>1</id> <name>张三</name> <age>20</age> </user>JSON转码封装和解封装还原读取
<?php class index { public string $Username; private string $Email; private int $Age; private string $Password; public function __construct(string $Username,string $Email,int $Age,string $Password) { $this->Username = $Username; $this->Email = $Email; $this->Age = $Age; $this->Password = $Password; } public function __set(string $name, $value) { $this->$name = $value; } public function __get(string $name) { if (property_exists($this,$name)) { return $this->$name; } return null; } public function getter() { return $this->age; } public function setter(string $Password) { $this->Password = $Password; } public function getPassword() { return md5($this->Password); } } $UserIndex = new index("李四","xxx@163.com","18","999"); echo "姓名:" . $UserIndex->Username . "\n" . "<br>". "邮箱:" . $UserIndex->Email . "\n" . "<br>". "年龄:" . $UserIndex->Age . "\n". "<br>". "密码:". $UserIndex->getPassword()."\n"."<br>"; //json封装: $manMessage=array('name'=>$UserIndex->Username,'email'=>$UserIndex->Email,'age'=>$UserIndex->Age); $manMessage_json=json_encode(($manMessage),JSON_UNESCAPED_UNICODE); echo '<br>'.'json封装后:'.$manMessage_json."\n"."<br>"; //json解封装数据还原: echo '<br>'.'解封装后:'; var_dump(json_decode($manMessage_json,true)); //打印指定值 $data =json_decode($manMessage_json,true); echo '邮箱是:'.$data['email'];这是用户提交信息
JSON实战应用演示
前端封装并提交:
前端js封装json并向后端发送json文件:
/** * 用户登录 JSON 封装并提交到 login.php * 运行:node login.js */ const loginData = { username: 'admin', password: '123456', }; // 封装为 JSON 字符串 const jsonBody = JSON.stringify(loginData); fetch('http://localhost/json模拟/后端json解封装.php', { method: 'POST', header: { 'Content-Type': 'application/json', }, body: jsonBody, }) //返回文本 // .then((res) => res.text()) // .then((text) => { // console.log('PHP 返回:'); // console.log(text); // }) //返回状态码 .then((adc) => adc.json()) .then((result) => { console.log('状态码 code:', result.code); console.log('完整返回:', result); }) .catch((err) => { console.error('请求失败:', err.message); });后端json解封装:
<?php /** * 接收前端 JS 封装的登录 JSON,解封装后输出 */ header('Content-Type: application/json; charset=utf-8'); // 读取 JS 发来的原始 JSON $rawJson = file_get_contents('php://input'); // 解封装:JSON 字符串 → PHP 数组 $loginData = json_decode($rawJson, true); if (json_last_error() !== JSON_ERROR_NONE) { echo json_encode([ 'success' => false, 'message' => 'JSON 解析失败', ], JSON_UNESCAPED_UNICODE); exit; } // 输出解封装后的数据 echo json_encode([ 'code' => 200, 'success' => true, 'message' => '接收并解封装成功', 'received' => [ 'username' => $loginData['username'] ?? '', 'password' => $loginData['password'] ?? '', ], ], JSON_UNESCAPED_UNICODE);返回结果:
可以看的出来,前端js收到了后端的状态码和数据,并按照前端的方式打印结果。
