RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1079273
Accepted
danilshik
danilshik
Asked:2020-02-07 00:23:43 +0000 UTC2020-02-07 00:23:43 +0000 UTC 2020-02-07 00:23:43 +0000 UTC

在一个答案中改造不同的模型

  • 772

有一些搜索请求在其字段中返回包含不同模型的 JSON。

例子

{
 "resultCount":13,
 "results": [
{"wrapperType":"collection", "collectionType":"Album", "artistId":40876509, "collectionId":259510974, "amgArtistId":310510, "artistName":"D+", "collectionName":"Dandelion Seeds", "collectionCensoredName":"Dandelion Seeds", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/dandelion-seeds/259510974?uo=4", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "collectionExplicitness":"notExplicit", "trackCount":12, "copyright":"℗ 1998 K Records", "country":"USA", "currency":"USD", "releaseDate":"2007-09-04T07:00:00Z", "primaryGenreName":"Alternative"}, 
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511004, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"Cut It Out", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"Cut It Out", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/cut-it-out/259510974?i=259511004&uo=4", "trackViewUrl":"https://music.apple.com/us/album/cut-it-out/259510974?i=259511004&uo=4", 
"previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview71/v4/4e/fc/93/4efc93a5-f3f0-0c7e-ed14-68cb6b6d6fbd/mzaf_5721197462467928771.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":1, "trackTimeMillis":236187, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true}, 
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511045, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"Green Party", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"Green Party", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/green-party/259510974?i=259511045&uo=4", "trackViewUrl":"https://music.apple.com/us/album/green-party/259510974?i=259511045&uo=4", "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/Music/v4/eb/c7/6a/ebc76a4f-3825-8060-f781-a0f36532f198/mzaf_876283245701275269.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":2, "trackTimeMillis":170587, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true}, 
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511130, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"Don't Worry About Me", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"Don't Worry About Me", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/dont-worry-about-me/259510974?i=259511130&uo=4", "trackViewUrl":"https://music.apple.com/us/album/dont-worry-about-me/259510974?i=259511130&uo=4", "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/Music/v4/00/79/54/007954d4-c7f7-8900-cf96-1173ca7f608f/mzaf_5029393603193854925.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":3, "trackTimeMillis":227293, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true}, 
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511261, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"Dandelion Wine", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"Dandelion Wine", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/dandelion-wine/259510974?i=259511261&uo=4", "trackViewUrl":"https://music.apple.com/us/album/dandelion-wine/259510974?i=259511261&uo=4", 
"previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview62/v4/bd/42/36/bd423652-c476-10f5-a1f5-383adfa56eb4/mzaf_1251229812831649846.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":4, "trackTimeMillis":231653, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true}, 
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511347, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"Profits Are Soaring", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"Profits Are Soaring", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/profits-are-soaring/259510974?i=259511347&uo=4", "trackViewUrl":"https://music.apple.com/us/album/profits-are-soaring/259510974?i=259511347&uo=4", "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/Music/v4/35/f3/46/35f34609-4e71-ae71-355b-c6ac72181730/mzaf_5686900859081999102.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":5, "trackTimeMillis":249600, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true}, 
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511409, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"Rusted", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"Rusted", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/rusted/259510974?i=259511409&uo=4", "trackViewUrl":"https://music.apple.com/us/album/rusted/259510974?i=259511409&uo=4", "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/Music2/v4/8b/33/67/8b336773-9747-cafe-a624-2ea18a8069a6/mzaf_2729424859737659172.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":6, "trackTimeMillis":316987, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true}, 
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511510, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"My Best Day", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"My Best Day", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/my-best-day/259510974?i=259511510&uo=4", "trackViewUrl":"https://music.apple.com/us/album/my-best-day/259510974?i=259511510&uo=4", "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/Music/v4/41/4c/a7/414ca717-b07d-b927-9ffa-8da8a231f2ac/mzaf_3343910103798289777.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":7, "trackTimeMillis":188480, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true}, 
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511537, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"His Heels", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"His Heels", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/his-heels/259510974?i=259511537&uo=4", "trackViewUrl":"https://music.apple.com/us/album/his-heels/259510974?i=259511537&uo=4", 

这种情况下如何发送请求,后面又如何解析呢?

fun getAlbumAndSongs(
        @Query("id") collectionId : Long,
        @Query("entity") entity: String = "songs"
    ) : Response<BaseResponse<T>>

用什么来代替T?我不能指定 2 个不同的型号?

data class BaseResponse<T>(
    val resultCount : Int,
    val results : List<T>
)

更新

val baseEntity = body.results.map {
                        gson.fromJson(it.toString(), BaseEntity::class.java)
                    }

因错误而崩溃

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 142 path $.collectionName
android
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    IR42
    2020-02-07T05:06:05Z2020-02-07T05:06:05Z
    fun getAlbumAndSongs(
            @Query("id") collectionId : Long,
            @Query("entity") entity: String = "songs"
        ) : Response<BaseResponse<JsonObject>>
    
    // в функции 
    val response = service.getAlbumAndSongs(id, entity)
    if (response.isSuccessful) {
        val gson = Gson()
        val responseMap = response.body()?.results?.groupBy { it["wrapperType"].asString ?: "" } ?: emptyMap()
        // лист объектов где wrapperType == "collection"
        val collectionList = responseMap["collection"]?.map { gson.fromJson(it, Collection::class.java) } ?: emptyList()
        // лист объектов где wrapperType == "track"
        val trackList = responseMap["track"]?.map { gson.fromJson(it, Track::class.java) } ?: emptyList()
        // ...
    } else {
        // обработать ошибку
    }
    

    CollectionTrack这是您存储相应对象的数据类

    • 2
  2. Alex_Skvortsov
    2020-02-07T01:50:05Z2020-02-07T01:50:05Z

    注意:如果使用 Gson 解析 Json,建议解决方案。

    班级结构:

    data class BaseResponse<T>(
        val resultCount: Int,
        val results: List<T>
    )
    
    abstract class Answer {
        abstract val wrapperType: String
    }
    
    data class Collection(
        override val wrapperType: String,
        val collectionType: String
    ) : Answer()
    
    data class Track(
        override val wrapperType: String,
        val kind: String
    ) : Answer()
    

    Gson 初始化:

    val builder = GsonBuilder()
    builder.registerTypeAdapter(Answer::class.java, InterfaceAdapter<Answer>())
    val gson = builder.create()
    

    适配器:

    class InterfaceAdapter<T>: JsonDeserializer<T>{
        override fun deserialize(
            json: JsonElement?,
            typeOfT: Type?,
            context: JsonDeserializationContext
        ): T {
            val member = json as JsonObject
    
            val type = when(member["wrapperType"]?.asString){
                "collection" -> Collection::class.java
                "track" -> Track::class.java
                else -> return context.deserialize(json, typeOfT)
            }
    
    
            return context.deserialize(json, type)
        }
    
    }
    

    服务器响应代码:

    fun getAlbumAndSongs(
        @Query("id") collectionId : Long,
        @Query("entity") entity: String = "songs"
    ) : Response<BaseResponse<*>>
    

    获取数据:

    val firstStep = api.getAlbumAndSongs(id)
    val secondStep = BaseResponse(firstStep.resultCount, firstStep.results.map { 
        gson.fromJson(it.toString(), Answer::class.java) 
    })
    

    解决方案非常难看,写在膝盖上,所以我强烈建议改进它。如果您可以改进(或找到更好的) - 请补充此答案。

    • 1
  3. Сергей Фролов
    2020-02-07T03:45:52Z2020-02-07T03:45:52Z

    您可以尝试将属性存储在关联列表中。

    例子:

    data class MusicItem(val wrapperType: String, val map: Map<String, Any?>)
    
    data class Collection(val map: Map<String, Any?>) {
        val collection: String by map
        val collectionType: String by map
    }
    
    data class Track(val map: Map<String, Any?>){
        val kind: String by map
        val artistId: String by map
    }
    
    
    fun List<MusicItem>.getTracks(): List<Track> {
        return this.filter { it.wrapperType == "track" }.map { Track(it.map) }.toList()
    }
    
    fun List<MusicItem>.getCollections(): List<Collection> {
    return this.filter { it.wrapperType == "collection" }.map { Collection(it.map) }.toList()
    }
    
    data class BaseResponse<T>(
    val resultCount : Int,
    val results : List<MusicItem>)
    

    用法:

    val musicItems: List<MusicItem> = api.getAlbumAndSongs(id).results
    val tracks = musicItems.getTracks()
    val collections = musicItems.getCollections()
    

    PS 拐杖当然还是一样的,但是好像比上一个答案要容易一点。

    PPS 我的意见 - 重新制作 API 以在不同的数组中返回不同的模型会更好

    PPPS 增加了 List 的扩展功能,使用起来似乎更方便了。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5