PHP中JSON数据的编解码与注意事项详解
在PHP开发中,JSON是前后端交互最常用的数据格式。本文将从基础入手,详细讲解如何使用 json_encode() 进行编码以及 json_decode() 进行解码,包括数组转JSON时的类型差异、类属性的过滤逻辑,以及如何正确解析JSON字符串并处理常见的语法错误。
从5.2版本开始的内置支持
自PHP 5.2版本起,原生提供了 json_encode() 和 json_decode() 函数,分别用于将PHP数据结构转换为JSON格式,以及将JSON字符串还原为PHP数据结构。这两个函数是处理API数据交互的基础。
一、json_encode():从PHP到JSON
json_encode() 主要用于将数组(Array)和对象(Object)转换为JSON格式的字符串。
第1步:转换索引数组
当传入纯索引数组时,结果保持为JSON数组格式([])。
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
输出结果为:{"a":1,"b":2,"c":3,"d":4,"e":5}
第2步:转换对象
当传入对象时,结果转换为JSON对象格式({})。注意,只有 public 类型的属性会被序列化,其他属性和常量会被忽略。
$obj->body = 'another post';
$obj->id = 21;
$obj->approved = true;
$obj->favorite_count = 1;
$obj->status = NULL;
echo json_encode($obj);
输出结果为:
{
"body":"another post",
"id":21,
"approved":true,
"favorite_count":1,
"status":null
}
注意事项:json_encode() 仅接受UTF-8编码的字符。如果参数是GB2312或其他非UTF-8编码(如ISO-8859-1),可能会得到空字符或 null。因此,在处理中文等多字节字符前,务必确保数据已转为UTF-8编码。
二、索引数组与关联数组的区别
PHP中的数组分为两种:
1. 索引数组(Indexed Array):只保存值。
2. 关联数组(Associative Array):保存键值对。
由于JavaScript不直接支持关联数组概念,json_encode() 会根据键的类型决定输出格式:
- 纯数字索引的数组 → 输出为JSON数组
[] - 包含非整数键或字符串键的数组 → 输出为JSON对象
{}
示例对比
情况A:纯索引数组
$arr = array('one', 'two', 'three');
echo json_encode($arr);
结果:["one","two","three"]
情况B:关联数组(或带数字键的数组)
即使键是数字,只要它们不是连续的从0开始的自然数序列,或者显式指定了键名,就会被视为关联数组。
$arr = array(1 => 'one', 2 => 'two', 3 => 'three');
echo json_encode($arr);
结果:{"1":"one","2":"two","3":"three"}
可以看到,数据格式从 [] 变成了 {}。
强制转换技巧:如果你希望将一个纯索引数组强制转换为JSON对象格式,可以使用强转类型或 JSON_FORCE_OBJECT 选项:
// 方法1:强制类型转换
json_encode((object)$arr);
// 方法2:使用标志位
json_encode($arr, JSON_FORCE_OBJECT);
三、类(Class)的转换规则
当对类的实例进行JSON编码时,json_encode() 的行为遵循以下规则:
public属性:被保留并序列化。private/protected属性:被忽略。- 常量(
const)和方法(function):被忽略。
示例演示:
class Foo {
const ERROR_CODE = '404';
public $public_ex = 'this is public';
private $private_ex = 'this is private!';
protected $protected_ex = 'this should be protected';
public function getErrorCode() {
return self::ERROR_CODE;
}
}
$foo = new Foo;
$foo_json = json_encode($foo);
echo $foo_json;
输出结果:{"public_ex":"this is public"}
这表明,只有公开变量能成功转换,其他成员均会丢失。
四、json_decode():从JSON到PHP
json_decode() 用于将JSON文本转换为PHP数据结构。默认情况下,它返回一个 stdClass 对象。
第1步:默认解析为对象
$json = '{"foo": 12345}';
$obj = json_decode($json);
print $obj->foo; // 输出 12345
第2步:强制解析为关联数组
如果希望直接获取PHP关联数组而非对象,需要将第二个参数设置为 true。
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json, true));
结果将是一个标准的PHP关联数组:array(["a"]=>1, ["b"]=>2, ...)
五、json_decode() 的常见错误排查
在使用 json_decode() 时,如果返回 null,通常是因为输入的字符串不符合严格的JSON语法规范。以下是三种典型的错误写法:
$bad_json_1 = "{ 'bar': 'baz' }"; // 错误1:键和值使用了单引号
$bad_json_2 = '{ bar: "baz" }'; // 错误2:键未加引号
$bad_json_3 = '{ "bar": "baz", }'; // 错误3:最后一个元素后有多余的逗号
JSON语法规则提醒:
- 引号必须为双引号:JSON字符串的键和字符串值必须使用双引号(
"),不支持单引号(')。 - 键名必须加引号:冒号左边的键名在任何情况下都必须用双引号包裹。
- 禁止尾随逗号:最后一个值之后不能添加逗号(trailing comma)。
其他边界情况:
json_decode()只能解析表示对象({})或数组([])的JSON字符串。- 如果对原始字符串(如
"Hello World")或数值直接使用json_decode(),它将返回null。
以上就是PHP中使用json_encode和json_decode处理JSON数据的详细内容,更多关于PHP后端开发技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













