PHP处理第三方JSON响应 统一将答案字段转换为数组格式
问题描述
我收到了无法自主控制的第三方平台返回的JSON响应,示例如下:
$json = '{ "question1": "answera", "question2": [ "answerb", "answerc"] }';
任意question(问题)字段都可对应多个answer(答案),但当某个问题仅有1个答案时,接口返回的对应值不会包裹[]数组括号,该格式不符合下游同样无法自主控制的系统的接收要求,下游系统强制要求所有答案字段必须为[]包裹的数组格式。
需要使用PHP对该JSON字符串做格式处理,无论每个问题对应的答案数量为多少,都统一转换为带[]的数组格式。例如将单答案的字段处理为如下格式:
"question1": ["answera"],
实现方法
完全可以通过PHP实现该格式转换,核心处理逻辑共3步:
- 将原始JSON字符串解码为PHP关联数组
- 遍历所有问题对应的答案值,若值不是数组类型,则将其包裹为单元素数组
- 将处理完成的数组重新编码为JSON字符串即可
完整可运行代码如下:
<?php // 第三方接口返回的原始JSON字符串 $json = '{ "question1": "answera", "question2": [ "answerb", "answerc"] }'; // 解码为关联数组,第二个参数传true表示返回数组而非对象 $parsedData = json_decode($json, true); // 遍历处理每个答案字段,统一转为数组格式 foreach ($parsedData as $questionKey => $answerValue) { if (!is_array($answerValue)) { // 非数组的单答案,包装为单元素数组 $parsedData[$questionKey] = [$answerValue]; } } // 重新编码为JSON,JSON_PRETTY_PRINT用于格式化输出,可根据实际需求移除 $formattedJson = json_encode($parsedData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); // 输出结果验证 echo $formattedJson; ?>
处理后输出的JSON符合下游系统要求,结构如下:
{ "question1": [ "answera" ], "question2": [ "answerb", "answerc" ] }
扩展说明
如果返回的JSON存在多层嵌套结构,只需要将上述遍历逻辑改为递归遍历即可,核心判断规则不变:所有答案字段只要不是数组类型,就统一包裹为单元素数组。使用json_encode时可根据实际业务场景调整参数,例如需要保留中文原始字符可添加JSON_UNESCAPED_UNICODE,需要压缩输出去掉格式缩进可移除JSON_PRETTY_PRINT参数。
内容的提问来源于stack exchange,提问作者megaSteve4
相关产品推荐
相关产品推荐

