Android中LoginActivity登录异常:PHP JSON匹配但提示不匹配
嘿,我来帮你捋一捋这个问题!既然注册功能正常、PHP脚本本身也没问题,那问题大概率出在登录请求/响应的细节处理上,给你列几个常见的排查点:
确认响应头的Content-Type是否正确
很多时候PHP返回了正确的JSON字符串,但没设置Content-Type: application/json响应头,Android的JSON解析器可能会把响应当成普通文本处理,导致解析失败。你可以在登录接口的PHP代码开头加上这行:header('Content-Type: application/json');用Postman或者浏览器开发者工具查看响应头,确认这个字段是否存在。
排查JSON里的隐藏字符
你的示例JSON看起来没问题,但PHP文件可能带有UTF-8 BOM头,或者在输出JSON之前有多余的空格、换行(比如<?php标签前的空白)。这些看不见的字符会让JSON变得不合法。- 把PHP文件保存为无BOM的UTF-8格式
- 建议去掉PHP的闭合标签
?>,避免意外输出空白 - 也可以用
trim()处理输出的JSON:echo trim(json_encode($response_data));
检查Android端的解析逻辑
你的响应是数组包裹的单个对象,如果Android代码直接尝试解析成单个JSONObject而不是先取JSONArray再拿第一个元素,肯定会报错。正确的解析逻辑应该类似:String jsonStr = response.body().string(); JSONArray jsonArray = new JSONArray(jsonStr); JSONObject loginResult = jsonArray.getJSONObject(0); String code = loginResult.getString("code"); // 后续处理用户名、密码字段另外也要确认Android端有没有对响应字符串做额外的截取、转义操作,破坏了原始JSON结构。
抓包验证实际返回的JSON
用Android Studio的Network Inspector或者Charles这类抓包工具,捕获登录请求的真实响应字符串,和你预期的JSON对比。有时候你在PHP里打印的JSON和实际返回的可能因为编码、转义问题有差异,比如引号是否被意外转义了。检查密码字段的额外处理
虽然示例里返回的哈希密码本身不影响JSON解析,但要确认Android端是否对这个字段有特殊的解析逻辑(比如是否错误地期望明文),不过这个概率比较低,重点还是放在JSON结构和响应格式上。
内容的提问来源于stack exchange,提问作者user9550968

