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

JAVAlang.IllegalStateException:使用GSON解析JSON时的JSON对象和JSON数组

龚安民
2023-03-14

服务器JSON数据显示在活动中使用改造。JSON数据通过gson转换。

给错误:"java.lang.IllegalState异常:预期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
    }
}

主要活动。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个答案

房新翰
2023-03-14

改造接口:

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

提示您需要一个公司列表。但是,您收到的json是一个公司列表。这就是你得到的gson错误告诉你的——应该以一个数组开始,但它是一个对象。

将改造接口更改为:

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

将提示Reformation,您需要一个类型为CompanyList的单一对象,这应该适用于您发布的json。

 类似资料:
  • 问题内容: 我有一个JSON,它可以是单个对象或相同对象的数组。有没有一种方法可以使用Gson解析此数据,从而区分单个对象还是数组? 我目前唯一的解决方案是手动解析json并用try catch包围它。首先,我将尝试将其解析为单个对象,如果失败,它将引发异常,然后尝试将其解析为数组。 我不想手动解析它……那将使我永远。这是正在发生的事情的想法。 这是可以是数组或单个对象的对象。 然后在与json响

  • 问题内容: 我有一个像这样的JSON对象: 并尝试与Gson解析: 但是“ responceBean”始终为“ null” 这是所有其他类: 这是我的最新尝试。我不知何故找不到正确的方法。任何帮助将不胜感激。 问题答案: 您的 JSON模型与您的对象模型不匹配 。 您需要一个中间层来填补空白: TypeAdapter 。 而且,没有用户的命名信息。 最后是名称不匹配:JSON中的“ worklog

  • 我有一个这样的JSON文件: 如何使用Gson仅解析“数据”部分?我的想法是将JSON读入地图,然后用我在GSON中的键“数据”解析普通JSON内容。我能做些更优雅的事吗?

  • 问题内容: 我试图从JSON数组中获取每个JSON对象。我通过HTTP发布获得此数据。 我知道我的数据是什么样的: 我的示例代码和结构如下所示: 我不确定如何遍历JSON数组并获取JSON对象,然后仅使用JSON对象。 问题答案: 试试这个作为您的结构, 您的名称不正确,顶层名称也不正确。解码为a之后,您可以遍历切片以获取每个切片

  • 问题内容: 我有一个像这样的JSON文件: 在文件具有根元素之前,我将使用: 代码,但我不认为如何将类编码为根元素是一个数组。 我试过使用: 与: 但是还没有运气。使用这种方法我还能怎么读呢? PS我有这个工作使用: 但是我更想知道如何使用这两种方法(如果可能)。 问题答案: 问题是由放置在数组中的JSON对象(在 每种 情况下)的末尾逗号引起的: 如果删除它们,您的数据将成为 和 应该工作正常。

  • 附言:我用这个来工作: 但我更希望知道如何做到这一点(如果可能的话)与这两种方法。