Moshi 预计 BEGIN_OBJECT 但在路径 $ BEGIN_ARRAY

Moshi expected BEGIN_OBJECT but was BEGIN_ARRAY at path $

这不是改装,而是在 Firebase 消息处理程序服务中手动解析。我在构建 Moshi 实例时使用 KotlinJsonAdapterFactory()

出于某种原因,当我要求将其中一个节点解析为对象时,它认为其中一个节点是一个数组。这是 JSON:

[
{
    "$": {
        "updateOrigin": "CIS",
        "requestSource": "at20",
        "requestID": "0000000000004144"
    },
    "TS": [{
            "$": {
                "rid": "202008207681819",
                "uid": "L81819",
                "ssd": "2020-08-20"
            },
            "Location": [{
                    "$": {
                        "tpl": "PADTON",
                        "wtd": "17:28",
                        "ptd": "17:28"
                    },
                    "dep": [{
                            "$": {
                                "et": "17:28",
                                "src": "Darwin"
                            }
                        }
                    ],
                    "plat": [{
                            "_": "2",
                            "$": {
                                "platsup": "true",
                                "cisPlatsup": "true",
                                "platsrc": "M"
                            }
                        }
                    ]
                }
            ]
        }
    ]
}
]

这是我的数据 类:

package com.cniekirk.traintimes.model
import com.squareup.moshi.Json

data class PushPortMessage(
    val pushPortMessageItems: List<PushPortMessageItem>?
)

data class PushPortMessageItem(
    @Json(name = "TS")
    val tS: List<TS>?,
    @Json(name = "$")
    val messageAttrs: MessageAttrs?
)

data class TS(
    @Json(name = "LateReason")
    val lateReason: List<String>?,
    @Json(name = "Location")
    val location: List<Location>?,
    @Json(name = "$")
    val tsAttrs: TSAttrs?
)

data class MessageAttrs(
    @Json(name = "updateOrigin")
    val updateOrigin: String?
)

data class Location(
    @Json(name = "arr")
    val arr: List<Arr>?,
    @Json(name = "dep")
    val dep: List<Dep>?,
    @Json(name = "pass")
    val pass: List<Pass>?,
    @Json(name = "plat")
    val plat: List<Plat>?,
    @Json(name = "$")
    val stationAttrs: StationAttrs?
)

data class TSAttrs(
    @Json(name = "rid")
    val rid: String?,
    @Json(name = "ssd")
    val ssd: String?,
    @Json(name = "uid")
    val uid: String?
)

data class Arr(
    @Json(name = "$")
    val arrPassAttrs: List<ArrPassAttrs>?
)

data class Dep(
    @Json(name = "$")
    var depAttrs: DepAttrs?
)

data class Pass(
    @Json(name = "$")
    val arrPassAttrs: ArrPassAttrs?
)

data class Plat(
    @Json(name = "_")
    val platform: Int?,
    @Json(name = "$")
    val platAttrs: PlatAttrs?
)

data class PlatAttrs(
    @Json(name = "platsup")
    val platsup: Boolean?,
    @Json(name = "cisPlatsup")
    val cisPlatsup: Boolean?
)

data class StationAttrs(
    @Json(name = "pta")
    val pta: String?,
    @Json(name = "ptd")
    val ptd: String?,
    @Json(name = "tpl")
    val tpl: String?,
    @Json(name = "wta")
    val wta: String?,
    @Json(name = "wtd")
    val wtd: String?,
    @Json(name = "wtp")
    val wtp: String?
)

data class ArrPassAttrs(
    @Json(name = "delayed")
    val delayed: String?,
    @Json(name = "et")
    val et: String?,
    @Json(name = "src")
    val src: String?
)

data class DepAttrs(
    @Json(name = "delayed")
    val delayed: String?,
    @Json(name = "et")
    val et: String?,
    @Json(name = "etUnknown")
    val etUnknown: String?,
    @Json(name = "etmin")
    val etmin: String?,
    @Json(name = "src")
    val src: String?
)

我可能只是太笨了,但我找不到问题所在。这是我解析 JSON:

的方式
val pushPortMessage = data["body"]
val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()

val pushPortAdapter = moshi.adapter(PushPortMessage::class.java)
pushPortMessage?.let {
    val msg = pushPortAdapter.fromJson(pushPortMessage)
    println(msg)
}

你正在解析一个对象列表而不是对象,所以解析应该是这样的

val pushPortMessage = data["body"]
val moshi = Moshi.Builder()
            .add(KotlinJsonAdapterFactory())
            .build()
val listType = Types.newParameterizedType(List::class.java, PushPortMessageItem::class.java)
val adapter: JsonAdapter<List<PushPortMessageItem>> = moshi.adapter(listType)
val pushPortMessageList = adapter.fromJson(pushPortMessage )