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

Android Java中Retrofit POST传数组仅保存最后一个元素如何解决

排查解决步骤

第一步:优先排查Retrofit服务接口定义

你的问题90%以上出在Service类中createJob方法的注解配置上:

  • 如果你当前用了@FormUrlEncoded + @Field("tags")传数组参数,表单传参默认会把数组元素拼接覆盖,最终只会保留最后一个值,和你遇到的现象完全吻合。
  • 如果你是拆分参数拼接请求体,没有使用结构化的Body传参,也会导致数组序列化错误。

第二步:推荐最优修复方案(直接传POJO作为请求体)

你已经定义好了draftedJobPostModel实体类,直接用它作为整个JSON请求体即可,Gson会自动把tags字段序列化为标准数组格式:

  1. 修改Service接口的createJob定义:
// 替换成你的实际接口请求路径
@POST("job/create") 
Call<createJobPostModel> createJob(
    @Header("Authorization") String auth,
    @Body draftedJobPostModel postModel
);
  1. 调整请求调用代码,先构造POJO再传入:
// 构造请求实体,最后一个参数填你实际的post_type值
draftedJobPostModel postModel = new draftedJobPostModel(
    title, jobtype, fieldId, arrayTags, date, description, budget, "draft"
);
Service service = Client.retrofit.create(Service.class);
Call<createJobPostModel> call = service.createJob("Bearer " + token, postModel);
// 后续enqueue逻辑保持不变

可选校验方案:打印请求报文确认参数格式

如果修改后还是有问题,可以接入OkHttp的日志拦截器,打印完整的请求体确认tags格式:

// 构建OkHttpClient时添加拦截器
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(logging)
    .build();
// 构建Retrofit时传入该client

查看日志中请求体的tags字段,如果已经是数组格式但服务端返回还是字符串,那就是服务端解析逻辑的问题,需要和后端联调。

额外注意点

你给出的示例JSON中category_id和budget是字符串类型,而POJO中定义的是int类型,如果后续服务端报参数类型错误,可以把这两个字段的类型调整为String匹配接口要求。


内容的提问来源于stack exchange,提问作者Nadim Mahmud Ovi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:57:03