
json_encode() 严格遵循 JSON 规范,始终将键名(key)以双引号包裹的字符串形式输出;所谓“无引号键名”(如 s:"simple2")不符合 JSON 标准,无法通过原生函数实现,需明确区分合法 JSON 与非标准字符串格式。
`json_encode()` 严格遵循 json 规范,始终将键名(key)以双引号包裹的字符串形式输出;所谓“无引号键名”(如 `s:"simple2"`)不符合 json 标准,无法通过原生函数实现,需明确区分合法 json 与非标准字符串格式。
在 PHP 中,json_encode() 是生成 JSON 数据的核心函数,其设计目标是输出 RFC 8259 兼容的标准 JSON 字符串。这意味着:所有对象键(object keys)必须为双引号包围的字符串,例如 "s":"simple2" —— 这是语法强制要求,而非可选行为。
你期望的输出 [{s:"simple2",value:"simple2",...}] 实际上是 JavaScript 对象字面量(Object Literal)语法,而非 JSON。JSON 规范明确规定:
✅ 合法 JSON:{"s":"simple2","value":"simple2"}
❌ 非法 JSON(不被任何标准解析器接受):{s:"simple2",value:"simple2"}
因此,json_encode() 不可能也不应该 输出无引号键名——这样做将导致 json_decode()、JavaScript JSON.parse()、Python json.loads() 等所有标准解析器报错(SyntaxError: Unexpected token s in JSON at position 1)。
✅ 正确用法示例
$data = [
[
's' => 'simple2',
'value' => 'simple2',
'i' => 'img',
'u' => 'url',
'p' => '520.000000'
]
];
$json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $json;输出(标准、可解析、跨平台兼容):
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
[
{
"s": "simple2",
"value": "simple2",
"i": "img",
"u": "url",
"p": "520.000000"
}
]⚠️ 常见误区与注意事项
-
不要尝试“去除引号”:正则替换
/"(\w+)":/→$1:等操作会破坏 JSON 合法性,仅适用于调试或前端模板渲染等极少数非解析场景(如直接插入<script></script>内联 JS),但绝不可用于 API 响应、AJAX 数据交换或存储。 -
浮点数精度控制:若
p值为数字(如520.0),建议传入 float 类型并配合ini_set('serialize_precision', -1)或JSON_PRESERVE_ZERO_FRACTION(PHP 7.1+)避免尾部零丢失。 -
中文与特殊字符:务必确保源数据为 UTF-8 编码,否则
json_encode()可能返回false;可启用JSON_UNESCAPED_UNICODE避免\uXXXX转义。 -
对象 vs 数组行为:关联数组默认编码为 JSON 对象
{},索引数组编码为 JSON 数组[];如需强制转为对象,可用json_encode((object)$arr)或JSON_FORCE_OBJECT标志。
? 验证你的 JSON 是否有效?
推荐使用 https://www.php.cn/link/93975f35e2b50d0bc399f9b5db16c9d5 在线校验,或在 PHP 中添加错误检查:
立即学习“PHP免费学习笔记(深入)”;
$json = json_encode($data);
if ($json === false) {
throw new RuntimeException('JSON encode failed: ' . json_last_error_msg());
}总结:追求“无引号键名”本质是混淆了 JSON 与 JavaScript 语法。请坚持使用 json_encode() 输出标准 JSON,并在消费端(如前端 JS)直接 JSON.parse() 解析——这才是安全、可靠、符合工程规范的做法。


















