SOAP获取PHP数组转JSON前端解析报错求助
解决JSON解析报错:SyntaxError: Unexpected non-whitespace character after JSON
问题重现
通过SOAP协议获取数据转为PHP数组后,使用json_encode生成JSON输出,前端fetch解析时出现如下错误:
SyntaxError: Unexpected non-whitespace character after JSON at position 5795
单独保留站点名称+坐标,或站点名称+时间字段时JSON解析正常,同时包含所有字段则报错。
排查与解决步骤
1. 在PHP端直接检测JSON编码错误
先给PHP代码添加编码错误检测,快速定位后端问题根源:
$jsondata = json_encode($geostation); if (json_last_error() !== JSON_ERROR_NONE) { die('JSON编码失败: ' . json_last_error_msg()); } echo $jsondata;
这会直接输出编码时的具体错误信息(比如非法字符、编码不兼容等),不用依赖前端报错。
2. 处理SOAP返回的字段类型与编码
SOAP返回的属性可能是SimpleXMLElement对象而非字符串,或者包含非UTF-8编码的字符、不可见控制字符,导致json_encode处理异常。修改字段赋值逻辑,强制转字符串并清理内容:
$geostation = array(); foreach ($res->TripPointArr as $point) { // 强制转为字符串并清理首尾空白 $stationName = trim((string)$point->StationNm); $longitude = trim((string)$point->StLONGITUDE); $latitude = trim((string)$point->StLATITUDE); $timearrft = trim((string)$point->DtTmArrivalFt); // 过滤不可见控制字符(针对特殊异常情况) $cleanTime = preg_replace('/[\x00-\x1F\x7F]/u', '', $timearrft); $geostation[] = array( 'stationName' => mb_convert_encoding($stationName, 'UTF-8', 'auto'), 'longitude' => mb_convert_encoding($longitude, 'UTF-8', 'auto'), 'latitude' => mb_convert_encoding($latitude, 'UTF-8', 'auto'), 'timearrft' => mb_convert_encoding($cleanTime, 'UTF-8', 'auto') ); } $jsondata = json_encode($geostation); echo $jsondata;
3. 确保PHP输出无额外内容
检查getdata.php文件:
<?php标签前不能有空格、换行或HTML代码- 确认没有其他
echo、var_dump等输出额外内容的代码 - 避免文件带有UTF-8 BOM(可通过编辑器查看并移除)
4. 定位具体错误数据
如果以上步骤未解决问题,可临时输出报错位置附近的原始数据,查看是否存在特殊字符:
// 循环时添加索引,定位问题数据 $index = 0; foreach ($res->TripPointArr as $point) { // 替换20为接近报错位置的索引值,输出对应原始数据 if ($index === 20) { var_dump($point); die; } $index++; // ... 原有赋值逻辑 }
内容的提问来源于stack exchange,提问作者Potaposhnik
相关产品推荐
相关产品推荐

