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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:53:30