如何使用 MOSHI 将 json 字符串解析为列表

Rap*_*l M 4 android kotlin okhttp moshi

我正在解析下面的 JSON:

{
  "list": [
    {
      "data1": "data1",
      "transaction": {
        "data2": "data2",
        "data3": "data3"
      },
      "breakdowns": [
        {
          "data4": "data4",
          "data5": "data5"
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我使用 Moshi 和 okHttpClient 来处理这个 JSON。我的数据类是正确的

但是当我尝试如下解析它时:

val moshi = Moshi.Builder()
  .add(KotlinJsonAdapterFactory())
  .build()

val type = Types.newParameterizedType(List::class.java,PaymentRequest::class.java)

try{
   val q = moshi.adapter(type)
   paymentRequest = q.fromJson(response.body!!.source())!!
} catch (e: Exception) {
   println(e)
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:com.squareup.moshi.JsonDataException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at path $

Sơn*_*han 7

您不能将此 json 视为列表。它本身不是一个列表,但实际上是一个包含列表的 json 对象。

要解决这个问题,首先构建一个类来包装"list"

@JsonClass(generateAdapter = true)
data class Wrapper(@Json(name = "list") val list: List<PaymentRequest>)
Run Code Online (Sandbox Code Playgroud)

然后你就可以开始了:

val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()
val adapter = moshi.adapter<Wrapper>(Wrapper::class.java)
val paymentRequests = adapter.fromJson(response.body!!.source())!!.list
Run Code Online (Sandbox Code Playgroud)