
本文介绍在 php 中将 json 响应中所有字符串类型的字段值自动转换为单元素数组,确保无论原始数据是字符串还是数组,最终输出的每个字段值均为数组类型,从而兼容严格要求数组格式的下游系统。
本文介绍在 php 中将 json 响应中所有字符串类型的字段值自动转换为单元素数组,确保无论原始数据是字符串还是数组,最终输出的每个字段值均为数组类型,从而兼容严格要求数组格式的下游系统。
在与第三方平台集成时,常遇到 JSON 响应结构不一致的问题:同一字段(如 "question1")在单值时返回字符串("answera"),多值时返回数组(["answerb", "answerc"])。而下游系统(不可控)强制要求所有答案字段必须为数组格式(即带 []),否则解析失败。此时需在 PHP 层对 JSON 进行标准化预处理。
核心思路:解码 → 统一类型 → 重编码
首先使用 json_decode($json, true) 将 JSON 字符串转为关联数组;然后遍历所有键值对,将字符串值强制转换为单元素数组;最后用 json_encode() 输出标准化后的 JSON。
✅ 推荐方案:显式类型判断(清晰、可维护)
<?php $json = '{
"question1": "answera",
"question2": ["answerb", "answerc"],
"question3": "answerd"
}';
$array = json_decode($json, true);
foreach ($array as $key => $value) {
if (is_string($value)) {
$array[$key] = [$value];
}
// 若 value 已是数组(含空数组),保持原样;若为 null/number/bool,按需处理(本文聚焦字符串→数组)
}
$normalizedJson = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $normalizedJson;
?>
输出结果:
{
"question1": ["answera"],
"question2": ["answerb", "answerc"],
"question3": ["answerd"]
}
⚡ 简洁方案:强制类型转换(简洁、高效)
利用 PHP 的 (array) 类型转换特性——字符串转为含该字符串的数组,数组保持不变,null 转为空数组(需注意此行为):
foreach ($array as $key => $value) {
$array[$key] = (array) $value;
}
⚠️ 注意:(array) null 得到 [],(array) 123 得到 [123]。若源数据可能含非字符串/非数组类型(如数字、布尔、null),请根据业务逻辑决定是否接受此隐式转换,或改用 is_string() 显式判断更安全。
关键注意事项
- 仅处理顶层字段:上述示例针对扁平 JSON 结构。若答案嵌套在深层对象(如 "data": {"questions": {...}}),需递归遍历或定位目标路径。
- 保留原始结构:json_encode() 默认不转义 Unicode,建议添加 JSON_UNESCAPED_UNICODE 参数避免中文乱码;JSON_PRETTY_PRINT 仅用于调试,生产环境可省略以减小体积。
-
错误处理不可少:实际应用中务必检查 json_decode() 返回值是否为 null(解析失败),并验证输入 JSON 的合法性:
if (json_last_error() !== JSON_ERROR_NONE) { throw new InvalidArgumentException('Invalid JSON input'); } - 性能考量:对于高频调用场景,(array) 方案因省去函数调用开销略快,但差异微乎其微;可读性与健壮性优先推荐显式判断。
通过以上处理,即可无缝适配下游系统对数组格式的硬性要求,无需修改第三方接口或下游逻辑,实现稳定、可维护的中间层数据标准化。











