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

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接受纯文本格式的响应:

  1. 首先在Module级别的build.gradle中添加纯文本转换器的依赖(版本要和你的Retrofit版本一致):
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
  1. 然后在创建Retrofit实例时,把ScalarsConverterFactory放在GsonConverterFactory前面:
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(ScalarsConverterFactory.create()) // 先添加纯文本转换器
    .addConverterFactory(GsonConverterFactory.create())    // 再添加JSON转换器
    .build();
  1. 最后修改你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:06:24