如何获取按行排列的JSON数组响应?API返回格式异常排查
问题:API调用返回JSON格式混乱,与测试界面不一致
我正在通过API调用JSON数组,当前遇到数据返回格式的问题。API自带的测试界面返回的是0到9共10行规整排列的JSON数组,但我使用自行编写的代码调用时,返回的格式十分混乱。请问出现该问题的原因是什么?该如何修复?
我的调用代码如下:
$curl = curl_init(); //adding fields to the curl object to enter the site curl_setopt($curl, CURLOPT_URL, $my_url); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); //executing the curl call and getting data back $json = curl_exec($curl); curl_close($curl); // close the connection echo $json;
解答
别担心,这个问题其实很常见,主要有两个可能的原因,对应的修复方法也很简单:
原因1:你看到的「混乱」只是原始JSON的无格式显示
API自带的测试界面会自动帮你把返回的JSON做格式化处理(添加换行、缩进),让内容看起来规整易读;但你的代码直接echo $json输出的是API返回的原始JSON字符串——它本身是紧凑的、没有多余空格和换行的,所以看起来就会一团乱,但数据本身是没问题的。
修复方法:手动格式化JSON输出
你可以用PHP的json_decode先把字符串转成数组/对象,再用json_encode配合JSON_PRETTY_PRINT参数重新编码成带格式的JSON:
$curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $my_url); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); $json = curl_exec($curl); curl_close($curl); // 先解码,再格式化输出 $data = json_decode($json, true); if ($data !== null) { // 设置响应头为JSON类型,让浏览器也能识别并格式化 header('Content-Type: application/json'); echo json_encode($data, JSON_PRETTY_PRINT); } else { // 处理JSON解码失败的情况 echo "JSON解析错误:" . json_last_error_msg(); }
原因2:可能存在压缩响应处理异常
虽然你设置了CURLOPT_ENCODING让curl自动处理gzip/deflate压缩,但极少数情况下,可能因为服务器端压缩配置或者curl环境问题,导致返回的内容没有被正确解压缩,出现乱码或异常格式。
排查&修复方法:
- 先输出
var_dump($json)看看返回的内容,如果是乱码或者非JSON格式的字符串,尝试去掉CURLOPT_ENCODING选项,让curl自动协商编码:curl_setopt($curl, CURLOPT_ENCODING, ''); // 清空编码设置 - 如果还是不行,可以尝试手动解压缩:
if (function_exists('gzdecode')) { $json = gzdecode($json); }
内容的提问来源于stack exchange,提问作者Victor Velasco
相关产品推荐
相关产品推荐

