java.lang.IllegalStateException: JSON OBJECT и JSON ARRAY при разборе Json с использованием GSON - PullRequest
4 голосов
/ 29 марта 2019

Сервер JSON Отображение данных в действии с использованием Retrofit.Данные JSON конвертируются через gson.

Дает ошибку: "java.lang.IllegalStateException: ожидаемый BEGIN_ARRAY, но был BEGIN_OBJECT в строке 1, путь 2 столбца $"

Формат JSON:

{"success":1,"company":[{"Cmp_Id":"1","Cmp_Name":"ABC","GSTIN":"AAAA"}]}

Код:

class Company {

  //@SerializedName("Cmp_Id")
  var Cmp_Id : Int = 0

  //@SerializedName("success")
  //val success : String = ""

  //@SerializedName("Cmp_Name")
  var Cmp_Name : String? = ""

  //@SerializedName("GSTIN")
  var GSTIN : String? = ""
}


class CompanyList {
  val success : String = ""

  lateinit var company : ArrayList<Company>
}


interface APIInterface { 
  @GET("Company.php")
  fun getCompanyData() : Observable<List<CompanyList>>
}


object APIClient {

  val BASE_URL = "http://10.0.2.2/"
  var retrofit:Retrofit? = null
  val apIClient:Retrofit?
    get() {
        if (retrofit == null)
        {
            retrofit =  Retrofit.Builder().
                    baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build()
        }
        return retrofit
    }
}

MainActivity.kt

private fun fetchData(){
   /* compositeDisposable.add(api.getCompanyData()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe { companyList-> displayData(companyList)
            }
    )*/

    val retrofit = APIClient.apIClient
    if (retrofit != null) {
        api = retrofit.create(APIInterface::class.java)
    }

    api.getCompanyData()
            .subscribeOn(Schedulers.io())
            .unsubscribeOn(Schedulers.computation())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ companyAdapter.setCompany(it.component1().company)
            },{

                Toast.makeText(applicationContext, it.message, Toast.LENGTH_SHORT).show()


            })
}

1 Ответ

0 голосов
/ 29 марта 2019

Модифицированный интерфейс:

interface APIInterface {
  @GET("Company.php")
  fun getCompanyData() : Observable<List<CompanyList>>
}

Подсказывает, что вы ожидаете список CompanyList. Тем не менее, JSON, который вы получаете, является одним CompanyList. Это то, что говорит вам ваша ошибка gson - ожидается, что она начнется с массива, но это был объект.

Изменение интерфейса модернизации на:

interface APIInterface {
  @GET("Company.php")
  fun getCompanyData() : Observable<CompanyList>
}

подскажет, что вы ожидаете, что один объект типа CompanyList будет работать для json, который вы разместили.

...