如何选择 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 并将其发送到大查询或谷歌云存储桶

如何将 JSON 字符串转换为数组

如何使用javascript和html上传json文件并将其转换为excel文件

如何接收 json 字符串并将其转换为字典?

如何将 Excel 转换为 JSON 并将其附加到现有的 JSON 文件?

如何将我上传的文件转换为 json