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

如何将JSON结构转换为Java/Kotlin代码 适配Retrofit接口请求场景

嵌套JSON解析实现方案

Retrofit默认配合Gson/Moshi等序列化库即可自动完成JSON到实体类的映射,嵌套结构只需要定义对应的嵌套实体类即可,无需手动实现复杂的解析逻辑。

前置依赖配置

需要在项目中引入Retrofit的Gson转换器依赖(以Gradle为例):

implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

创建Retrofit实例时指定Gson转换器:

// Kotlin 示例
val retrofit = Retrofit.Builder()
    .baseUrl("你的API根地址")
    .addConverterFactory(GsonConverterFactory.create())
    .build()

Kotlin 代码示例

Kotlin使用data class定义实体类,编译器会自动生成默认的setter、getter、equals、toString等方法,代码非常简洁:

//  launches数组对应的实体类
data class Launch(
    val id: String,
    val provider: String
)

// events数组对应的实体类
data class Event(
    val id: String,
    val provider: String
)

// 根Article实体类
data class Article(
    val id: Int,
    val featured: Boolean = false, // 对应默认值false
    val title: String,
    val url: String,
    val imageUrl: String,
    val newsSite: String,
    val summary: String,
    val publishedAt: String,
    val launches: List<Launch>, // 对应JSON数组,用List包裹子实体类
    val events: List<Event>
)

如果JSON的key和你定义的字段名不一致,可以用@SerializedName注解指定匹配的JSON key,比如:

data class Article(
    @SerializedName("id")
    val articleId: Int,
    // 其余字段同理
)

Java 代码示例

Java需要手动为每个字段编写setter、getter方法,且必须保留无参构造方法:

// Launch实体类
public class Launch {
    private String id;
    private String provider;

    // 必须保留无参构造
    public Launch() {}

    // 生成getter、setter
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getProvider() { return provider; }
    public void setProvider(String provider) { this.provider = provider; }
}

// Event实体类
public class Event {
    private String id;
    private String provider;

    public Event() {}

    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getProvider() { return provider; }
    public void setProvider(String provider) { this.provider = provider; }
}

// Article根实体类
public class Article {
    private int id;
    private boolean featured = false;
    private String title;
    private String url;
    private String imageUrl;
    private String newsSite;
    private String summary;
    private String publishedAt;
    private List<Launch> launches;
    private List<Event> events;

    public Article() {}

    // 所有字段的getter、setter
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    public boolean isFeatured() { return featured; }
    public void setFeatured(boolean featured) { this.featured = featured; }
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }
    public String getUrl() { return url; }
    public void setUrl(String url) { this.url = url; }
    public String getImageUrl() { return imageUrl; }
    public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; }
    public String getNewsSite() { return newsSite; }
    public void setNewsSite(String newsSite) { this.newsSite = newsSite; }
    public String getSummary() { return summary; }
    public void setSummary(String summary) { this.summary = summary; }
    public String getPublishedAt() { return publishedAt; }
    public void setPublishedAt(String publishedAt) { this.publishedAt = publishedAt; }
    public List<Launch> getLaunches() { return launches; }
    public void setLaunches(List<Launch> launches) { this.launches = launches; }
    public List<Event> getEvents() { return events; }
    public void setEvents(List<Event> events) { this.events = events; }
}

Retrofit 接口调用示例

定义API接口时直接使用定义好的实体类作为返回值即可:

interface ApiService {
    @GET("你的接口路径")
    suspend fun getArticle(@Query("id") id: Int): Response<Article>
}

调用接口后直接从返回值中读取嵌套字段即可,比如article.launches[0].id就能拿到第一层launch的id值。

内容的提问来源于stack exchange,提问作者Georgi Tasev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:36:05