Android项目登录API Postman正常但JSON报Unexpected 'S',需转JSONArray/JSONObject
解决Android登录API JSON解析"Unexpected 'S'"错误的方案
我来帮你梳理下这个问题的核心:服务器返回的响应不是标准JSON格式,Postman能正常显示纯文本内容,但Android端尝试用JSONArray/JSONObject解析非JSON内容时,就会抛出"Unexpected 'S'"错误(这个'S'大概率是服务器返回的"Success"这类纯文本的首字母)。下面分步骤帮你解决:
一、修复服务器端PHP代码,返回标准JSON
你给出的PHP代码不完整,但从逻辑来看,当前应该是直接echo字符串(比如echo "Success")来返回结果,这不是标准JSON。需要修改代码,确保返回符合JSON规范的响应:
- 首先设置响应头为JSON类型,明确告诉客户端这是JSON数据
- 用
json_encode()把结果封装成JSON对象/数组返回
修正后的示例PHP代码:
<?php include("Connection.php"); header('Content-Type: application/json'); // 必须添加这个响应头,让客户端识别JSON格式 if(isset($_POST["email"]) && isset($_POST["password"])) { $email = $_POST["email"]; $password = $_POST["password"]; // 补全你原始SQL的语法错误,同时注意:这里存在SQL注入风险,生产环境建议用预处理语句 $result = mysqli_query($conn, "select * from user_master where email='$email' and password='$password'"); $response = array(); if(mysqli_num_rows($result) > 0) { // 查询到用户,返回成功状态和用户数据 $user = mysqli_fetch_assoc($result); $response["status"] = "success"; $response["user"] = $user; } else { // 未查询到用户,返回失败状态 $response["status"] = "failed"; $response["message"] = "Invalid email or password"; } // 输出JSON格式的响应 echo json_encode($response); } else { // 参数缺失的情况 $response["status"] = "error"; $response["message"] = "Missing required parameters"; echo json_encode($response); } mysqli_close($conn); ?>
重要提醒:你的原始SQL语句存在严重的SQL注入风险,生产环境一定要使用预处理语句(比如
mysqli_prepare()绑定参数)来避免这个问题。
二、调整Android端LoginRequest.java的解析逻辑
根据服务器返回的JSON类型(上面示例是JSONObject),对应调整Android端的解析代码:
如果服务器返回的是JSONObject(推荐的单用户场景)
比如服务器返回的是{"status":"success","user":{"id":1,"email":"xxx@xxx.com"}},解析代码示例:
// 假设你用OkHttp获取响应 String responseBody = response.body().string(); try { JSONObject jsonObject = new JSONObject(responseBody); String status = jsonObject.getString("status"); if(status.equals("success")) { JSONObject userObj = jsonObject.getJSONObject("user"); // 解析用户数据,比如 String email = userObj.getString("email"); } else { String message = jsonObject.getString("message"); // 处理登录失败的逻辑,比如提示用户账号密码错误 } } catch (JSONException e) { e.printStackTrace(); // 之前的"Unexpected 'S'"错误就会出现在这里,修复服务器响应后应该不会再触发 }
如果服务器返回的是JSONArray(多用户列表场景)
如果你的需求是返回用户列表,服务器端可以返回[{"id":1,"email":"xxx"},{"id":2,"email":"yyy"}],Android端解析:
String responseBody = response.body().string(); try { JSONArray jsonArray = new JSONArray(responseBody); for(int i=0; i<jsonArray.length(); i++) { JSONObject userObj = jsonArray.getJSONObject(i); // 解析每个用户的数据 } } catch (JSONException e) { e.printStackTrace(); }
三、快速调试技巧
- 在Android端打印服务器返回的原始响应体:
Log.d("LoginResponse", responseBody);,这样能直接确认服务器返回的内容是否符合JSON规范 - 确保Android端的请求方式(POST)、参数名和Postman里完全一致,避免因为参数缺失导致服务器返回错误文本
内容的提问来源于stack exchange,提问作者Chandra Kiran
相关产品推荐
相关产品推荐

