跨服务传输数据或提供 api 时优先用 json。php 的 serialize() 可用于 php 内部保存可信值。读取客户端输入时使用 json 并校验字段,避免把外部字符串交给 unserialize()。
比较同一组数据的两种往返
把示例保存为 formats.php。反序列化的输入在同一脚本中生成,演示数据只有数组和标量。
<?php $data = ['sku' => 'A01', 'count' => 2]; $native = serialize($data); var_dump(unserialize($native, ['allowed_classes' => false]) === $data); $json = json_encode($data, JSON_THROW_ON_ERROR); var_dump(json_decode($json, true, 512, JSON_THROW_ON_ERROR) === $data);

运行 php formats.php,预期两个结果都是 true。允许类选项无法让任意外部序列化输入变得可信。
为外部 JSON 定义字段约束
将下面的函数加入脚本。调用者可在应用边界捕获 JsonException 和 InvalidArgumentException。
立即学习“PHP免费学习笔记(深入)”;
function readItem(string $json): array
{
$item = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
if (!is_array($item)
|| !is_string($item['sku'] ?? null)
|| !is_int($item['count'] ?? null)
|| $item['count'] < 1) {
throw new InvalidArgumentException('商品字段不合法');
}
return ['sku' => $item['sku'], 'count' => $item['count']];
}返回值只保留接口明确接收的字段。JSON 可以表示结构,但字段含义由应用定义。
核对非法字段的处理
分别传入正常数据和字符串类型的数量。
var_export(readItem('{"sku":"A01","count":2}'));
try {
readItem('{"sku":"A01","count":"2"}');
} catch (InvalidArgumentException $error) {
echo PHP_EOL, $error->getMessage(), PHP_EOL;
}第一条成功,第二条提示商品字段不合法。已有 PHP 内部缓存如果要迁移,应先确认读写两端的格式一致。



















