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

4

我想解析以下JSON:

{
  "list": [
    {
      "data1": "data1",
      "transaction": {
        "data2": "data2",
        "data3": "data3"
      },
      "breakdowns": [
        {
          "data4": "data4",
          "data5": "data5"
        }
      ]
    }
  ]
}

我会帮您翻译 IT 技术相关的内容。需要翻译的文本如下:

我正在使用 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)
}

我遇到了这个错误:com.squareup.moshi.JsonDataException: 期望的是BEGIN_ARRAY,但在路径$处却是BEGIN_OBJECT
2个回答

6

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

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

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

那么你就可以开始了:

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

1

这对我有用,将Json转换为Moshi中的List

@TypeConverter
    fun toListAWDataItem(json: String): List<Person>? {
        val type: Type = Types.newParameterizedType(
            List::class.java,
            Person::class.java
        )
        val adapter: JsonAdapter<List<Person>> = moshi.adapter<List<Person>>(type)
        return adapter.fromJson(json)!!.map { it }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接