使用Retrofit解析嵌套JSON列表时取值遇问题?如何解决?
解决Retrofit解析嵌套JSON列表的问题
我来帮你搞定这个Retrofit解析嵌套JSON的问题!你遇到的是典型的嵌套结构JSON解析场景——每个业务字段(比如ID、NATIVE_DATE)都被包装成了一个包含Tag、TypeCode等属性的对象,咱们一步步来解决:
1. 定义匹配的数据模型
首先要创建和JSON结构完全对应的数据类(Kotlin)或POJO(Java),核心是先把每个字段的嵌套结构抽成通用类,再组合成外层的列表项类。
Kotlin 示例
// 通用嵌套字段类,对应每个业务字段的内部结构 data class FieldData( val Tag: String, val TypeCode: Int, val Value: String, val IsBinaryUnique: Boolean ) // 外层列表项类,对应JSON数组里的每个对象 data class AnnouncementItem( val ID: FieldData, val NATIVE_DATE: FieldData, val ANNOUNCEMENT_DATE: FieldData, val EXPIRY: FieldData, val ANNOUNCEMENT_DESCRIPTION: FieldData // 其他字段按需补充 )
Java 示例
// 通用嵌套字段POJO public class FieldData { private String Tag; private int TypeCode; private String Value; private boolean IsBinaryUnique; // Getter和Setter(可以用Lombok注解简化) public String getTag() { return Tag; } public void setTag(String tag) { Tag = tag; } public int getTypeCode() { return TypeCode; } public void setTypeCode(int typeCode) { TypeCode = typeCode; } public String getValue() { return Value; } public void setValue(String value) { Value = value; } public boolean isBinaryUnique() { return IsBinaryUnique; } public void setBinaryUnique(boolean binaryUnique) { IsBinaryUnique = binaryUnique; } } // 外层列表项POJO public class AnnouncementItem { private FieldData ID; private FieldData NATIVE_DATE; private FieldData ANNOUNCEMENT_DATE; private FieldData EXPIRY; private FieldData ANNOUNCEMENT_DESCRIPTION; // 对应Getter和Setter public FieldData getID() { return ID; } public void setID(FieldData ID) { this.ID = ID; } // 其他字段的Getter/Setter同理补充 }
2. 配置Retrofit与JSON转换器
确保你的Retrofit实例配置了正确的JSON转换器(比如Gson),默认的GsonConverterFactory会自动匹配字段名。如果JSON字段名和你的代码风格不一致(比如想把NATIVE_DATE改成nativeDate),可以用@SerializedName注解做映射:
// Kotlin示例:用注解映射字段名 data class AnnouncementItem( @SerializedName("ID") val id: FieldData, @SerializedName("NATIVE_DATE") val nativeDate: FieldData // 其他字段同理 )
Retrofit实例创建代码:
val retrofit = Retrofit.Builder() .baseUrl("你的接口基础URL") .addConverterFactory(GsonConverterFactory.create()) .build()
3. 编写Retrofit接口
定义返回List<AnnouncementItem>的接口方法:
interface AnnouncementApi { @GET("你的接口路径") suspend fun getAnnouncements(): Response<List<AnnouncementItem>> }
4. 调用接口并获取业务值
拿到数据后,直接通过嵌套对象的Value属性就能获取实际业务内容了:
// 协程中调用示例 val api = retrofit.create(AnnouncementApi::class.java) val response = api.getAnnouncements() if (response.isSuccessful) { val announcements = response.body() announcements?.forEach { item -> val id = item.ID.Value val nativeDate = item.NATIVE_DATE.Value val expiry = item.EXPIRY.Value // 这里会拿到空字符串,注意空值处理 // 处理其他字段 println("ID: $id, 本地日期: $nativeDate") } }
常见问题排查
- 解析报错先检查字段名大小写是否完全匹配,或者是否遗漏了
@SerializedName注解 - 注意空值:比如
EXPIRY的Value是空字符串,Kotlin里可以把Value设为String?来兼容 - 确认已经添加了Converter的依赖(比如Gson的gradle依赖)
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

