如何使用TypeAdapterFactory创建Gson对象以匹配我的POKO模型?

时间:2019-03-09 14:44:06

标签: android kotlin gson retrofit

我设法通过以下POKO进行了改造:

data class GifSerialList(var data: List<GifSerial>)
data class GifSerial(var id: String,
                 var title: String,
                 @SerializedName("import_datetime") var importDatetime: String,
                 var user: User?,
                 var images: Image)
data class User(@SerializedName("display_name") var userDisplayName: String)
data class Image(@SerializedName("fixed_height") var fixedHeight: Size)
data class Size(var url: String)

匹配以下json:

{
"data": [
    {
        "id": "oefi3of93jf2f9",
        ...
        "import_datetime": "2014-03-29 13:55:35",
        ...
        "user": {
            ...
            "display_name": "User Display Name",
        },
        "images": {
            ...             
            "fixed_height": {
                "url": "https://giflink.gif",
                ...
            },
            ...
        },
        "title": "GIF Title",
        ...
    },
    {

具有以下改装要求:

@GET("trending")
fun getTrending(@Query("api_key") apiKey: String): Call<GifSerialList>

我想弄对了,避免了GifSerialList的怪诞,我应该使用TypeAdapterFactory创建与原始POKO匹配的json:

data class Gif(var id: String,
           var title: String,
           @SerializedName("display_name") var authorDisplayName: String?,
           @SerializedName("import_datetime") var importDateTime: String,
           var url: String) : Parcelable

问题:

TypeAdapterFactory-在这里读(输入:JsonReader)是正确的方法吗?

我应该使用哪种TypeAdapterFactory改造请求?

fun getTrending(@Query("api_key") apiKey: String): Call<List<Gif>>
fun getTrending(@Query("api_key") apiKey: String): Call<Gif>
fun getTrending(@Query("api_key") apiKey: String): Call<GifSerialList>

关于将json read()函数内容放在一起的任何建议吗? 到目前为止,无论我尝试什么,我都会得到典型的BEGIN_ARRAY或BEGIN_OBJECT异常。 我不完整的TypeAdapterFactory read()函数如下:

override fun read(input: JsonReader): T {
                var jsonElement = elementAdapter.read(input)
                var jsonObject = jsonElement.asJsonObject
                val jsonArray = jsonObject.getAsJsonArray("data")
                for (item in jsonArray) {
                    Log.d(TAG, "item: $item")
                    jsonObject = item.asJsonObject
                }
                jsonElement = jsonObject
                return delegate.fromJsonTree(jsonElement)
            }

如何选择所需的json Gif POKO元素并将它们一起返回?我是否需要在此处创建json元素列表,然后返回?

0 个答案:

没有答案