PHP中json_encode()未输出带方括号JSON数组的问题解决
问题产生原理
PHP的json_encode()对数组的编码有固定映射规则,和JSON的两种基础结构一一对应:
- 当传入的数组是从0开始的连续数字索引数组(不存在字符串键、数字索引无跳号)时,会编码为带方括号
[]的JSON数组 - 当传入的数组是关联数组(存在字符串键、或数字索引不连续)时,会编码为带花括号
{}的JSON对象
你最初的代码里,applicants字段直接赋值为存储用户信息的关联数组,符合第二种编码规则,所以输出的是直接的JSON对象,没有外层数组方括号。而接收端接口定义applicants字段为数组类型(设计上支持传入多个申请人,即使当前只传1个也要求用数组格式包裹),类型不匹配就会导致解析失败。
你提到的参考文档示例时\n写法报错,一般是复制示例时遗漏了上下文的常量参数(比如格式化输出的JSON_PRETTY_PRINT相关配置),属于书写语法错误,和核心的数组类型映射逻辑无关。
其他合规实现写法
除了你已经使用的写法,还有几种等价的合规实现,编码输出效果完全一致:
- 提前定义单条申请人数据,再直接包裹为索引数组,避免重复书写数组结构:
// 先定义单个申请人的关联数组 $applicant = [ "firstName" => $_POST["firstName"], "lastName" => $_POST["lastName"], "email" => $_POST["email"], "telephone" => $_POST["telephone"] ]; // 组装数据时直接包裹成数组即可 $data = [ "applicants" => [$applicant], // 直接把单条数据放到空索引数组里 "buyerType" => $_POST["buyerType"], "organisationId" => "xxxxxxxxxx" ];
- 传统
array()语法和短数组[]语法完全等价,两种写法编码结果没有区别,根据团队编码规范选择即可:
// 传统写法和短数组写法效果一致 "applicants" => array( array( "email" => $_POST["email"], // 其余申请人字段 ) )
注意:不要为了调整输出格式误用
json_encode()的参数,比如JSON_FORCE_OBJECT的作用是把所有数组强制编码为对象,和你需要的数组输出效果完全相反,使用前需要确认参数实际作用。
内容的提问来源于stack exchange,提问作者Yenmangu
相关产品推荐
相关产品推荐

