如何选择 JSON 的特定部分并将其转换为使用 Moshi 改造的列表
Posted
技术标签:
【中文标题】如何选择 JSON 的特定部分并将其转换为使用 Moshi 改造的列表【英文标题】:How to select specific part of JSON and convert it to a List in retrofit with Moshi 【发布时间】:2021-05-28 21:09:45 【问题描述】:我从一个带有改造的 API 中得到 JSON 打击,我只想从中选择 production_companies 数组 并将其转换为 ProductionCompanie 类的列表,我如何使用 Moshi 来做到这一点不使用嵌套类?
"backdrop_path": "/52AfXWuXCHn3UjD17rBruA9f5qb.jpg",
"belongs_to_collection": null,
"budget": 63000000,
"genres": [
"id": 18,
"name": "Drama"
],
"homepage": "http://www.foxmovies.com/movies/fight-club",
"id": 550,
"popularity": 40.054,
"poster_path": "/8kNruSfhk5IoE4eZOc4UpvDn6tq.jpg",
"production_companies": [
"id": 508,
"logo_path": "/7PzJdsLGlR7oW4J0J5Xcd0pHGRg.png",
"name": "Regency Enterprises",
"origin_country": "US"
,
"id": 711,
"logo_path": "/tEiIH5QesdheJmDAqQwvtN60727.png",
"name": "Fox 2000 Pictures",
"origin_country": "US"
,
"id": 20555,
"logo_path": "/hD8yEGUBlHOcfHYbujp71vD8gZp.png",
"name": "Taurus Film",
"origin_country": "DE"
,
"id": 54051,
"logo_path": null,
"name": "Atman Entertainment",
"origin_country": ""
],
"vote_count": 21181
这是我改造的 APIs 界面:
interface Apis
@Headers("Content-Type: application/json")
@GET("/3/movie/550")
fun getData(@Query("api_key") key: String = apiKey): Call<List<ProductionCompanie>>
还有我的模特:
@JsonClass(generateAdapter = true)
data class ProductionCompanie(
@Json(name = "id")
val id: Int,
@Json(name = "logo_path")
val picture: String,
@Json(name = "name")
val name: String
)
【问题讨论】:
“嵌套类”是什么意思 您可以使用 Moshi 编写自定义 JSON 适配器,以便仅从您的 json 中解析 production_companies 数组。 @MehdiYari 你能给我举个例子吗?我想自动转换这个列表 @ali-star 抱歉,我的解决方案是编写一个类,用于将此 JSON 解析为具有JsonAdapter
抽象类的 production_companies 列表,这似乎不是您正在寻找的解决方案
【参考方案1】:
我最终使用了自定义适配器:
class ProductionCompanieListAdapter(private val moshi: Moshi)
@FromJson
fun fromJson(value: JsonReader): List<ProductionCompanie>?
val json = JSONObject(value.nextSource().readUtf8())
val jsonArray = json.getJSONArray("production_companies")
val type = Types.newParameterizedType(List::class.java, ProductionCompanie::class.java)
val adapter = moshi.adapter<List<ProductionCompanie>>(type)
return adapter.fromJson(jsonArray.toString())
@ToJson
fun toJson(value: List<ProductionCompanie>): String
val type = Types.newParameterizedType(List::class.java, ProductionCompanie::class.java)
val adapter = moshi.adapter<List<ProductionCompanie>>(type)
return adapter.toJson(value)
【讨论】:
以上是关于如何选择 JSON 的特定部分并将其转换为使用 Moshi 改造的列表的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Json 转换为 CSV 并将其发送到大查询或谷歌云存储桶
如何使用javascript和html上传json文件并将其转换为excel文件