
本文介绍使用 php 将第三方返回的不规范 json(部分字段为字符串、部分为数组)统一标准化为数组格式,确保所有答案字段均以 ["value"] 形式存在,从而兼容下游系统对数组结构的强制要求。
本文介绍使用 php 将第三方返回的不规范 json(部分字段为字符串、部分为数组)统一标准化为数组格式,确保所有答案字段均以 ["value"] 形式存在,从而兼容下游系统对数组结构的强制要求。
在与外部平台对接时,常遇到 JSON 响应结构不一致的问题:当某个问题(如 "question1")仅有一个答案时,API 返回的是字符串 "answera";而多个答案时则返回数组 ["answerb", "answerc"]。但下游系统(无法修改)严格要求所有答案字段必须是数组类型,否则解析失败。此时需在 PHP 端主动标准化数据结构。
标准化核心思路
通过 json_decode($json, true) 将 JSON 字符串转为关联数组,遍历每个键值对,将非数组类型的值(即字符串)强制包装为单元素数组,最后用 json_encode() 输出标准化后的 JSON。
✅ 推荐方案:显式类型判断 + 数组包装
<?php $json = '{
"question1": "answera",
"question2": ["answerb", "answerc"],
"question3": "answerd"
}';
// 解码为关联数组
$data = json_decode($json, true);
// 遍历并统一转换为数组
foreach ($data as $key => $value) {
if (!is_array($value)) {
$data[$key] = [$value];
}
}
// 重新编码为 JSON(保持标准格式)
$normalizedJson = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $normalizedJson;
?>
输出结果:
{
"question1": [
"answera"
],
"question2": [
"answerb",
"answerc"
],
"question3": [
"answerd"
]
}
⚡ 替代方案:强制类型转换 (array)
若追求简洁且确认输入仅含字符串或数组(无对象、数字、null 等),可直接使用类型转换:
foreach ($data as $key => $value) {
$data[$key] = (array) $value;
}
该写法更简短,但需注意:(array) null → [],(array) 42 → [42],(array) new stdClass() → []。若原始数据中可能存在数字、null 或对象,建议优先使用 is_array() 显式判断,避免意外行为。
注意事项
- JSON 键名匹配逻辑:本方案对所有顶层键生效。若需限定仅处理以 "question" 开头的字段,可增加前缀校验:if (str_starts_with($key, 'question') && !is_array($value))。
- 嵌套结构支持:当前示例仅处理一级结构。若 JSON 存在深层嵌套(如 "section": {"q1": "a"}),需改用递归函数遍历。
- 性能考量:对于超大 JSON,json_decode 内存占用较高,但绝大多数业务场景下无需过度优化;(array) 转换比 is_array() 判断略快,但差异微乎其微,可读性与健壮性更重要。
-
错误处理建议:生产环境应添加解码失败检查:
if (json_last_error() !== JSON_ERROR_NONE) { throw new InvalidArgumentException('Invalid JSON input'); }
通过上述方法,即可可靠地将不规范的混合类型 JSON 统一为下游系统所需的纯数组格式,无需修改任何外部接口,兼顾鲁棒性与可维护性。










