当前位置: 首页 > 知识库问答 >
问题:

Kotlin-Gson-应为BEGIN_数组,但为字符串

刘意
2023-03-14

我对gson反序列化有问题

是我儿子

[{"compteurdi":"00","numero":"DI00","message":"LOLOL","equipement":"LE TRUC","etat":"DEMANDER","demandeur":"MOI","datedi":"020202"}]

我的kotlin小工具

        "http://10.0.2.2:8080/WebApi/V1/index.php?op=getdis".httpGet().responseObject(DI.Deserializer())
    { request, response, result ->
        val(disw,err) = result
        println(err)
        disw?.forEach { DI ->
            dis.add(DI)
        }
        adapter = DiAdapter(dis,this    )
        val recyclerView = findViewById(R.id.di_recycler_view) as RecyclerView
        recyclerView.layoutManager = LinearLayoutManager(this) as RecyclerView.LayoutManager?
        recyclerView.adapter =  adapter
    }

还有我的反序列化函数

    class Deserializer:ResponseDeserializable<Array<DI>>{
    override fun deserialize(content: String): Array<DI>? = Gson().fromJson(content,Array<DI>::class.java)
}

我有这个错误

I/System.out: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $

我不明白什么是错误的,我真的觉得一切都是正确的,我做了多次不同的测试。

你能帮助我吗。

共有1个答案

裴姚石
2023-03-14

您的json响应是数组,您可以定义基于字符串的方式来显示错误。

您的json出现错误将json数据粘贴到此链接中显示错误。。http://www.jsonschema2pojo.org/

试着用它来改造api集成。

将以下依赖项添加到应用程序级渐变文件中。

// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'

在为api响应生成pojo类之后。。

public class ResponseUserData{

@SerializedName("datedi")
private String datedi;

@SerializedName("numero")
private String numero;

@SerializedName("equipement")
private String equipement;

@SerializedName("compteurdi")
private String compteurdi;

@SerializedName("demandeur")
private String demandeur;

@SerializedName("message")
private String message;

@SerializedName("etat")
private String etat;

public void setDatedi(String datedi){
    this.datedi = datedi;
}

public String getDatedi(){
    return datedi;
}

public void setNumero(String numero){
    this.numero = numero;
}

public String getNumero(){
    return numero;
}

public void setEquipement(String equipement){
    this.equipement = equipement;
}

public String getEquipement(){
    return equipement;
}

public void setCompteurdi(String compteurdi){
    this.compteurdi = compteurdi;
}

public String getCompteurdi(){
    return compteurdi;
}

public void setDemandeur(String demandeur){
    this.demandeur = demandeur;
}

public String getDemandeur(){
    return demandeur;
}

public void setMessage(String message){
    this.message = message;
}

public String getMessage(){
    return message;
}

public void setEtat(String etat){
    this.etat = etat;
}

public String getEtat(){
    return etat;
}

@Override
public String toString(){
    return 
        "ResponseUserData{" + 
        "datedi = '" + datedi + '\'' + 
        ",numero = '" + numero + '\'' + 
        ",equipement = '" + equipement + '\'' + 
        ",compteurdi = '" + compteurdi + '\'' + 
        ",demandeur = '" + demandeur + '\'' + 
        ",message = '" + message + '\'' + 
        ",etat = '" + etat + '\'' + 
        "}";
    }
  }

改造对象创建...

class ApiClient {

companion object {
    val BASE_URL = "https://simplifiedcoding.net/demos/"
    var retrofit: Retrofit? = null
    fun getClient(): Retrofit? {
        if (retrofit == null) {
            val interceptor = HttpLoggingInterceptor()
            interceptor.level = HttpLoggingInterceptor.Level.BODY
            val client = OkHttpClient.Builder().apply {
            readTimeout(20, TimeUnit.SECONDS)
            writeTimeout(20, TimeUnit.SECONDS)
            connectTimeout(20, TimeUnit.SECONDS)
            addInterceptor(interceptor)
            addInterceptor { chain ->
                var request = chain.request()
                request = request.newBuilder()
                        .build()
                val response = chain.proceed(request)
                response
            }
            }
            retrofit = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(client.build())

                    .addConverterFactory(GsonConverterFactory.create())
                    .build()

        }

        return retrofit
    }
}

}

为api调用生成接口后。。

interface ApiInterface {
@GET(NetworkConstant.DATA)
fun getData(): Call<List<Hero>> // define your response class

}

将api调用到片段或活动中。。

 private fun getHeroData() {
    val dialog= ProgressDialog(mContext)
    showProgress(dialog)
    var apiInterface: ApiInterface = ApiClient.getClient()!!.create(ApiInterface::class.java)
    var hero: Call<List<Hero>>
    hero = apiInterface.getData()
    hero.enqueue(object : Callback<List<Hero>> {
        override fun onFailure(call: Call<List<Hero>>?, t: Throwable?) {
            closeDialog(dialog)
            Toast.makeText(mContext, t?.message, Toast.LENGTH_SHORT).show()
            Log.d("Error:::",t?.message)
        }

        override fun onResponse(call: Call<List<Hero>>?, response: Response<List<Hero>>?) {
           mHeroDataList.clear()
            if (response != null && response.isSuccessful && response.body() != null) {
                closeDialog(dialog)
                mHeroDataList .addAll(response.body()!!)
                setAdapter(mHeroDataList)
            }
        }

    })
}
 类似资料:
  • 当我只收到列表中的一个项目时,就会出现这个错误。我在服务器端REST Web服务中使用Jersey,只有当列表返回一个元素时,以及当它有但当它有多个异常时,它工作得非常完美,我就是这样做的: Jersey为什么不发送包含一个项目的列表?是泽西岛的虫子吗?有没有办法让它始终序列化为数组? 这是web服务返回0元素时的JSON数据: 这是web服务返回1个元素时的JSON数据: 当web服务返回超过1

  • 我试图使用GSON解析一些非常简单的JSON。这是我的代码: 以下是从url返回的JSON: 我得到了一个例外: 有什么想法吗?我是格森的新手。

  • 这个错误又回来了! 我是改装的初学者,我看过这篇文章:改装:预期BEGIN_OBJECT但BEGIN_ARRAY 但是即使我试着让它适应我的模型,我仍然不能让它工作。所以我的错误是: 我得到的是: 解析类的属性: IoTGenericDevice子类的属性: 改装电话: 经理:

  • 我试图将JSON字符串转换为HashMap。下面是我的一些代码: 在这些行的最后一行(我在其中设置数据)抛出异常。 JSON字符串是 {"body":"body","start Date":"2014-05-30 11:00:00","endDate":"2014-05-30 12:00:00","位置":"位置","主题":"主题!"} 我得到的例外是 线程“main”java中出现异常。朗,反

  • 我想对我的数组使用。 提前致谢

  • 我知道以前有人问过很多这个问题,但在我的情况下,我找不到解决办法。我请求获得关于POJO(电影)列表的json回复 虽然这是我第一次使用改型,但我在标题中遇到了问题。我正在创建的url是正确的,下面是响应的示例: 这是我的模特 } 我的@GET 我的数据请求类 最后,我想在我的主要活动中做些什么