为啥当我解析我的响应 okHttp 时它不起作用

Posted

技术标签:

【中文标题】为啥当我解析我的响应 okHttp 时它不起作用【英文标题】:Why when I parse my response okHttp it doesn't work为什么当我解析我的响应 okHttp 时它不起作用 【发布时间】:2020-05-27 17:37:54 【问题描述】:

所以这是我的问题,我尝试解析对象的 json 数组,但抛出错误。我创建了一个 groupListType var,因为 Gson 没有解析我的对象并让我使用 String 数组,这给了我错误

这是函数的代码:

fun getPromoCode(): Array<Code> 


        val urlBuilder = HttpUrl.Builder()
            .scheme("https")
            .host("dev.api.gostyle.ovh")
            .addPathSegment("api")
            .addPathSegment("promotion")
            .addPathSegment("code")
            .addQueryParameter("user_id",sharedPreference.getValueString("UserId"))
            .build()


        var request = Request.Builder()
            .header("Authorization",sharedPreference.getValueString("MyGoStyleToken"))
            .url(urlBuilder)
            .build()


        var mareponse = client.newCall(request).execute()

            if (!mareponse.isSuccessful) throw IOException("Unexpected code $mareponse")

            var a: String = mareponse.body?.string().toString()
            val groupListType: Type = object: TypeToken<ArrayList<Code>>() .type
            var test = Gson().fromJson<Array<Code>>(a,groupListType) //Error here

            return test
     

我的数据类:

data class Code(
    var id: String = "default",
    var code:String = "default",
    var date_start:String = "default",
    var date_end:String = "default",
    var description: String = "default",
    var reduction: Double = 0.0
)

错误日志:

E/androidRuntime: FATAL EXCEPTION: AsyncTask #2
    Process: com.example.mygostyle, PID: 13854
    java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.example.mygostyle.Code[]
        at com.example.mygostyle.OkHttpHelper.getPromoCode(OkHttpHelper.kt:95)
        at com.example.mygostyle.ui.home.HomeFragment$MyCodesAdapter.<init>(HomeFragment.kt:72)
        at com.example.mygostyle.ui.home.HomeFragment$onCreateView$2.run(HomeFragment.kt:40)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)

json 对象示例:

[
    
        "id": "77fa026a-d519-40ec-ad03-a0532036473f",
        "code": "TEST1",
        "date_start": "2020-02-10T00:00:00.000Z",
        "date_end": "2020-02-10T00:00:00.000Z",
        "description": "TEST1",
        "reduction": 20
    ,
    
        "id": "8bade40a-33e5-4eee-a093-6b778c89df32",
        "code": "TEST2",
        "date_start": "2020-02-10T00:00:00.000Z",
        "date_end": "2020-02-10T00:00:00.000Z",
        "description": "TEST2",
        "reduction": 30
    
]

【问题讨论】:

【参考方案1】:

ArrayArrayList 是不同的类型。你只需要这个:

val result: Array<Code> = Gson().fromJson(a, Array<Code>::javaClass)
// use `result.toList()` if you need a list instead of an array

额外链接:

https://***.com/a/45605731/4751657 https://***.com/a/18421994/4751657

【讨论】:

以上是关于为啥当我解析我的响应 okHttp 时它不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试用 makefile 编译我的 qt 程序时它不起作用

一个 href 链接不起作用-当我单击链接 snimka1.html 时它不起作用,可能是许多 div 标签?-

为啥我的 RemoveItem 功能不起作用? - 上下文 API - 反应

使用 UITapGestureRecognizer 使键盘隐藏,当我在 UIButton 内触摸时它不起作用 [重复]

php登录页面 - 当我插入有效数据时它不起作用,但是当我插入无效数据时它完美地工作[重复]

为啥当我解构属性时接收道具的组件不起作用,但是当我使用 props.key 时它起作用了?