Android开发:如何用Retrofit传递含多JSONObject的JSONArray及iaList处理
问题描述
我已经创建了包含iList、Uplift的主模型类及对应的子模型类,但不清楚如何处理iaList这个包含多个JSONObject的JSON数组,想请教如何通过Retrofit向API传递这样的结构。
对应的请求JSON结构如下:
{ "iList": [ { "ADDRESS1": "string", "CITY": "string", "COUNTRY": "string", "EMAIL_ADDRESS": "string", "FIRST_NAME": "string", "LAST_NAME": "string", "PRIMARY_PHONE_NUMBER": "string", "STATE_PROVINCE": "string", "ZIP_CODE": "string" } ], "iaList": [ { "ATTRIBUTE_NAME": "string", "CUSTOM_PERMISSION": "string", "Id": "string", "GLOBAL_PERMISSION": "string" }, { "ATTRIBUTE_NAME": "string", "CUSTOM_PERMISSION": "string", "Id": "string", "GLOBAL_PERMISSION": "string" }, { "ATTRIBUTE_NAME": "string", "CUSTOM_PERMISSION": "string", "Id": "string", "GLOBAL_PERMISSION": "string" } ], "Uplift": [ { "AGE": 0, "AUTOMOBILE": "string", "CHILD_AGES": "string", "DATE_OF_BIRTH": "string", "EDUCATION": "string", "GENDER": "string" } ] }
解决方案
其实处理iaList和你处理iList、Uplift的逻辑完全一致,只是它包含多个对象而已,我一步步给你讲清楚:
1. 先创建iaList的子模型类
首先为iaList里的单个JSONObject创建对应的模型类,比如命名为IaItem,用Gson的注解确保字段和JSON键一一对应:
public class IaItem { @SerializedName("ATTRIBUTE_NAME") private String attributeName; @SerializedName("CUSTOM_PERMISSION") private String customPermission; @SerializedName("Id") private String id; @SerializedName("GLOBAL_PERMISSION") private String globalPermission; // 生成构造方法、getter和setter,也可以用Lombok简化代码 public IaItem(String attributeName, String customPermission, String id, String globalPermission) { this.attributeName = attributeName; this.customPermission = customPermission; this.id = id; this.globalPermission = globalPermission; } // 按需添加getter和setter方法 }
2. 在主模型类中添加iaList字段
在你已经创建的主模型类(比如叫MainRequestModel)里,把iaList定义为List<IaItem>类型,和另外两个数组字段保持一致:
public class MainRequestModel { @SerializedName("iList") private List<IListItem> iList; // 你已创建的iList子模型 @SerializedName("iaList") private List<IaItem> iaList; // 新增的iaList字段 @SerializedName("Uplift") private List<UpliftItem> uplift; // 你已创建的Uplift子模型 // 构造方法、getter/setter public MainRequestModel(List<IListItem> iList, List<IaItem> iaList, List<UpliftItem> uplift) { this.iList = iList; this.iaList = iaList; this.uplift = uplift; } }
3. 定义Retrofit接口
在你的Retrofit服务接口中,定义一个POST请求,参数类型为主模型类,Retrofit会自动将其序列化为符合要求的JSON结构:
public interface ApiService { @POST("your-api-endpoint-path") Call<ResponseBody> submitRequestData(@Body MainRequestModel requestModel); }
4. 构建请求并发起调用
接下来创建多个IaItem对象,把它们存入List,再传入主模型,最后发起Retrofit请求即可:
// 创建iaList的多个条目 List<IaItem> iaItems = new ArrayList<>(); iaItems.add(new IaItem("user_type", "read", "attr_001", "full_access")); iaItems.add(new IaItem("payment_level", "write", "attr_002", "limited_access")); iaItems.add(new IaItem("notification_setting", "read_write", "attr_003", "full_access")); // 构建另外两个列表(iList和Uplift),这里假设你已经会处理这部分 List<IListItem> iList = ...; List<UpliftItem> upliftList = ...; // 组装主请求模型 MainRequestModel requestModel = new MainRequestModel(iList, iaItems, upliftList); // 发起Retrofit请求 ApiService apiService = RetrofitClient.getInstance().create(ApiService.class); Call<ResponseBody> call = apiService.submitRequestData(requestModel); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { // 处理成功响应逻辑 } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { // 处理请求失败逻辑 } });
关键注意点
- 确保你的Retrofit实例已经配置了JSON转换器(比如Gson),否则无法完成模型到JSON的序列化:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://your-base-api-url.com/") .addConverterFactory(GsonConverterFactory.create()) .build();
- 如果你的模型字段名和JSON键名完全一致,也可以不用
@SerializedName注解,但建议加上,避免因为大小写或命名规范差异导致序列化失败。
内容的提问来源于stack exchange,提问作者vijju
相关产品推荐
相关产品推荐

