Retrofit抛出MalformedJsonException:Facebook登录后接口请求异常问题
解决Retrofit MalformedJsonException问题(后端返回"user added"却走onFailure)
这个问题我之前也碰到过,核心原因其实很明确:Retrofit默认会把后端响应当成JSON格式来解析(尤其是你用了GsonConverterFactory的情况下),但你的Slim后端返回的是纯文本字符串"user added",完全不符合JSON的结构要求(比如没有{}包裹的对象或[]包裹的数组),所以Gson解析器直接抛出了MalformedJsonException,导致Retrofit走到了onFailure方法,哪怕后端确实返回了成功提示。
下面给你两个可行的解决方案,按需选择:
方案1:修改后端返回合法JSON(推荐)
REST API的标准响应格式就是JSON,所以优先考虑调整后端代码,返回符合规范的JSON数据:
在你的Slim框架代码里,不要直接输出纯文本,改用框架自带的JSON响应方法:
// 替代echo "user added"的写法 return $response->withJson([ 'status' => 'success', 'message' => 'user added' ], 200);
这样Slim会自动帮你设置正确的Content-Type: application/json响应头,并且把数据编码成合法的JSON格式,Retrofit就能正常解析,走到onResponse方法里了。
如果不想用Slim的自带方法,也可以手动设置头并编码:
header('Content-Type: application/json'); echo json_encode(['message' => 'user added']); exit;
方案2:修改Retrofit配置,支持纯文本响应
如果暂时不想改动后端,也可以让Retrofit接受纯文本格式的响应:
- 首先在Module级别的
build.gradle中添加纯文本转换器的依赖(版本要和你的Retrofit版本一致):
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
- 然后在创建Retrofit实例时,把
ScalarsConverterFactory放在GsonConverterFactory前面:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(ScalarsConverterFactory.create()) // 先添加纯文本转换器 .addConverterFactory(GsonConverterFactory.create()) // 再添加JSON转换器 .build();
- 最后修改你的API接口方法,把返回类型改成
Call<String>:
@POST("/your-user-registration-endpoint") Call<String> registerUser(@Body YourRequestBodyModel body);
这样Retrofit就会把后端返回的"user added"当成纯文本处理,不会再触发JSON解析错误了。
额外排查小技巧
- 先用Postman或者curl调用你的后端接口,看看实际返回的内容是不是只有"user added",有没有额外的空格、换行或者PHP的调试输出/错误信息——这些隐藏字符也可能导致JSON解析失败。
- 确认你的Retrofit请求体的
Content-Type是application/json,后端能正确解析你提交的请求数据。
内容的提问来源于stack exchange,提问作者androiddev2
相关产品推荐
相关产品推荐

