
本文介绍使用 PHP 将第三方返回的不规范 JSON(部分字段为字符串、部分为数组)统一转换为数组格式,确保所有 questionX 字段值均为 ["value"] 形式,从而满足下游系统对数组结构的强制要求。
本文介绍使用 php 将第三方返回的不规范 json(部分字段为字符串、部分为数组)统一转换为数组格式,确保所有 `questionx` 字段值均为 `["value"]` 形式,从而满足下游系统对数组结构的强制要求。
在与外部平台集成时,常遇到 JSON 响应格式不一致的问题:当某个问题(如 "question1")仅有一个答案时,API 返回的是字符串 "answera";而多个答案时则返回数组 ["answerb", "answerc"]。但下游系统(无法修改)严格要求所有答案字段必须是 JSON 数组类型(即带 [ ]),否则解析失败或入库异常。
解决思路是:先解码为 PHP 关联数组,再遍历所有键值对,将非数组类型的值(如字符串)统一转为单元素数组,最后重新编码为标准 JSON。
以下是推荐的两种实现方式:
✅ 方案一:显式类型判断(清晰易维护)
<?php
$json = '{
"question1": "answera",
"question2": ["answerb", "answerc"],
"question3": "answerd"
}';
// 解码为关联数组(第二个参数 true 至关重要)
$data = json_decode($json, true);
// 遍历每个 question 字段,确保其值为数组
foreach ($data as $key => $value) {
if (!is_array($value)) {
$data[$key] = [$value]; // 强制包裹为单元素数组
}
}
// 重新编码为规范 JSON(保留原始结构,所有答案均为数组)
$normalizedJson = json_encode($data, JSON_PRETTY_PRINT);
echo $normalizedJson;输出结果:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
{
"question1": ["answera"],
"question2": ["answerb", "answerc"],
"question3": ["answerd"]
}✅ 方案二:强制类型转换(简洁高效)
利用 PHP 的 (array) 类型转换特性——对字符串、数字、null 等标量值自动转为单元素数组("abc" → ["abc"]),对原生数组则保持不变,代码更简练:
foreach ($data as $key => $value) {
$data[$key] = (array) $value;
}⚠️ 注意:该方式对 null 会转为 [](空数组),若业务中 null 表示“无答案”且需保留为 null,则应优先选用方案一并添加额外判断。
? 注意事项
- 始终使用 json_decode($json, true):避免返回 stdClass 对象,便于数组操作;
- 避免直接操作 JSON 字符串:正则替换或字符串拼接极易破坏 JSON 结构(如引号、转义字符),务必走标准解析→修改→序列化流程;
- 验证输入合法性:生产环境建议增加 json_last_error() 检查,防止无效 JSON 导致脚本中断;
- 兼容嵌套结构? 本文方案适用于扁平化 questionX 字段。若 JSON 存在深层嵌套(如 "questions": [{"id":"q1","answer":"a"}]),需改用递归处理函数。
通过以上方法,即可可靠、可维护地将异构 JSON 统一为下游系统所需的规范数组格式,无需依赖外部服务改造,完全由 PHP 层兜底适配。

















