Kotlin - Gson - ожидаемый BEGIN_ARRAY, но был STRING - PullRequest
0 голосов
/ 05 октября 2018

У меня проблема с десериализацией gson

это мой json

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

мой котлин httpget

        "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 Ответ

0 голосов
/ 05 октября 2018

Ваш ответ json является массивом, и вы определяете String для получения этого способа отображения ошибки.

И ваш json имеет ошибку, вставьте ваши данные json в эту ссылку показать ошибку .. http://www.jsonschema2pojo.org/

Попробуйте использовать Retrofit для работы с интеграцией 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'

после make pojo класса для вашего ответа API.

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)
            }
        }

    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...