You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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规范的响应:

  1. 首先设置响应头为JSON类型,明确告诉客户端这是JSON数据
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:30:28