如何将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
相关产品推荐
相关产品推荐

