使用Volley从PHP向Android获取JsonArray时遇JSONException错误求助
解决Volley获取JSONArray时的JSON解析异常
嘿,你遇到的org.json.JSONException: Value <!-- of type java.lang.String cannot be converted to JSONObject错误,根源很明显:你的PHP接口返回的响应不是纯JSON格式——开头的<!--是HTML注释标记,它混进了原本应该是纯JSON的响应里,直接把解析器搞懵了。
从你贴的响应片段能看到,后面确实有正确的JSON结构,但前面的<!--破坏了整个响应的完整性,解析器自然没法识别这是合法的JSON。
下面是具体的修复步骤:
第一步:排查PHP代码的输出问题
首先得确保你的PHP代码只输出JSON,没有多余内容:
- 检查PHP文件开头,
<?php标签前不能有空格、换行或者<!--这类注释; - 看看代码里有没有用
echo/print输出过调试信息、注释之类的非JSON内容; - 如果用了框架或模板,确认没有意外输出错误页面的HTML结构(很多PHP报错会被包裹在HTML注释里)。
第二步:让PHP输出纯净的JSON
修改你的PHP代码,确保最终只返回JSON数据,示例如下:
// 先关闭错误输出,防止报错信息混入JSON error_reporting(0); ini_set('display_errors', 0); // 构建要返回的数据数组 $responseData = [ "result" => [ ["subject_name" => "Entrepreneurship", "percentage" => 1.2], ["subject_name" => "Advanced Computing Platform", "percentage" => 1.14] ] ]; // 设置响应头,告诉客户端这是JSON格式 header('Content-Type: application/json'); // 输出JSON,注意不要加任何额外字符 echo json_encode($responseData); // 输出后立刻终止脚本,避免后续代码输出多余内容 exit;
小贴士:
json_encode会自动处理浮点数的精度问题,不用手动写那些超长的小数位,既简洁又能避免不必要的格式问题。
第三步:验证PHP响应的纯净度
直接在浏览器里访问你的PHP接口URL,看看返回的内容是不是完全是JSON字符串,没有任何前缀、后缀或注释。比如应该是这样的:
{"result":[{"subject_name":"Entrepreneurship","percentage":1.2},{"subject_name":"Advanced Computing Platform","percentage":1.14}]}
如果还能看到<!--或者其他奇怪的字符,说明PHP代码还有地方没排查到,得再仔细找。
临时适配方案(不推荐,治标不治本)
如果暂时没法修改PHP代码,也可以在Volley端先过滤掉多余字符再解析:
@Override protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) { try { String rawResponse = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); // 过滤开头的HTML注释 String cleanJson = rawResponse.replaceFirst("^<!--.*?-->", ""); JSONArray jsonArray = new JSONArray(cleanJson); return Response.success(jsonArray, HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException | JSONException e) { return Response.error(new ParseError(e)); } }
不过还是建议优先修复PHP端的问题,毕竟保证接口返回纯净的JSON才是规范的做法。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

