PHP生成JSONArray部署至真实服务器后出现JSON解析异常求助
JSONObject转换错误 这种问题大多是因为服务器上的PHP输出不是纯JSON内容,或者JSON格式存在问题,导致Java端拿到的是混杂了其他字符串的响应,没法直接转成JSONObject。结合你的情况,给你一步步排查和解决的方案:
1. 先确认服务器返回的内容是否纯净
本地EasyPHP环境可能默认关闭了错误提示,但真实服务器往往开启了display_errors,这会导致PHP输出警告、错误信息(比如数据库连接警告、变量未定义提示),这些内容会混在JSON前后,让整个响应变成"错误信息+JSON"的字符串,Java自然没法解析成JSONObject。
排查方法:直接在浏览器访问服务器上的PHP文件,查看页面源代码,看是不是只有你预期的JSON内容,有没有额外的文字、HTML标签或者空白行。
解决办法:
- 在PHP文件最开头加上以下代码,强制关闭错误输出:
error_reporting(0); ini_set('display_errors', 0);
- 检查PHP文件的开头:
<?php前面不能有任何空白字符(空格、换行、制表符),结尾可以直接去掉?>,避免后面不小心加了空白内容。
2. 强制设置JSON响应头
服务器可能默认把PHP输出当成普通文本返回,导致Java端没有正确识别这是JSON数据。在输出JSON之前,一定要设置响应头:
header('Content-Type: application/json; charset=utf-8');
这行代码会告诉客户端(你的Java程序):返回的是UTF-8编码的JSON格式数据,避免解析时出现编码或类型识别问题。
3. 验证JSON格式的正确性
即使本地生成的JSON没问题,服务器上的PHP版本或数据库返回的数据可能有差异,导致生成的JSON有语法错误(比如引号不闭合、多余的逗号、转义错误)。
排查方法:把服务器返回的JSON内容复制到JSON校验工具(比如本地的JSONlint)里检查,看是否有语法错误。
解决办法:
- 确保用PHP的
json_encode()函数生成JSON,不要手动拼接(手动拼接很容易出格式错误)。 - 如果数据里有中文,加上
JSON_UNESCAPED_UNICODE参数,避免中文被转义成Unicode编码,也能减少格式出错的概率:
json_encode(['chemData' => $your_data_array], JSON_UNESCAPED_UNICODE);
4. 检查PHP版本和扩展差异
本地EasyPHP的PHP版本可能和服务器不同,旧版本的json_encode对某些数据结构的处理可能有差异。另外,要确保服务器上的PHP开启了json扩展(大部分服务器默认开启,但可以通过phpinfo()确认)。
完整的示例PHP代码
结合上面的要点,你的PHP文件可以写成这样:
<?php // 关闭错误输出,防止干扰JSON内容 error_reporting(0); ini_set('display_errors', 0); // 设置JSON响应头 header('Content-Type: application/json; charset=utf-8'); // 数据库连接示例(替换成你的服务器数据库信息) $db_host = 'localhost'; $db_user = 'your_db_user'; $db_pass = 'your_db_password'; $db_name = 'your_db_name'; $conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name); if (!$conn) { // 即使连接失败,也要返回合法的JSON错误信息,而不是直接输出警告 echo json_encode(['error' => 'Database connection failed']); exit; } // 查询数据 $query = "SELECT ID, TYPE, COMPANY, SOLIDC, GRAMNEED, SOLUSE, PRICE FROM your_table"; $result = mysqli_query($conn, $query); $chemData = []; while ($row = mysqli_fetch_assoc($result)) { $chemData[] = $row; } // 生成并输出JSON echo json_encode(['chemData' => $chemData], JSON_UNESCAPED_UNICODE); // 关闭数据库连接 mysqli_close($conn); ?>
按照上面的步骤排查和修改,应该就能解决Java端的JSON解析错误了。
内容的提问来源于stack exchange,提问作者user9716615

