Moshi 期望 BEGIN_OBJECT 但在路径 $ 处为 BEGIN_ARRAY

2024-02-11

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

由于某种原因,当我要求将其中一个节点解析为对象时,它认为其中一个节点是一个数组。这是 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 )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Moshi 期望 BEGIN_OBJECT 但在路径 $ 处为 BEGIN_ARRAY 的相关文章

  • 虚拟回调接口

    在 Eclipse 为您创建的来自 Google 的示例主从流代码中 片段中包含以下内容 private Callbacks mCallbacks sDummyCallbacks public interface Callbacks pub
  • 我无法再在后台应用程序中接收任何 FCM 消息

    当应用程序处于后台时 我无法再在应用程序中接收任何数据消息 请注意 直到最近它在我的应用程序中都运行良好 也许在我的开发环境最近更新后它停止工作了 我不能说 所以我尝试用快速入门 android 项目 https github com fi
  • Play 商店中的应用描述更新

    我想更新应用程序的描述以及 Play 商店上的屏幕截图 但应用程序保持相同 即相同的版本号 我不想发布新应用程序 因为应用程序中没有任何更改 这可能吗 谷歌也会要求更新应用程序吗 您可以更新描述 也可以更改屏幕截图 您的应用程序将保持不变
  • 如何使用 Google 的 GithubBrowserSample 方法在片段之间共享视图模型?

    我对 Android 架构组件的使用非常陌生 因此我决定使用 GithubBrowserSample 来构建我的应用程序来实现我的许多用例 但我有一个问题 我不知道使用这种方法在片段之间共享视图模型的正确方法是什么 我想共享视图模型 因为我
  • 使用把手显示来自 parse.com 的 json 响应

    我想将 json 响应传递给车把 我已经查看了解析文档和 stackoverflow 问题 但我似乎无法弄清楚这一点 这是回应 results address 755 W Yale createdAt 2013 02 09T01 12 15
  • Toast 消息消失后​​完成活动吗?

    有谁知道 是否有可能对 Toast 消息执行某些操作 在我的情况下完成活动 将被关闭 您只需创建一个Thread持续时间只要Toast显示 然后您就可以完成您的Activity public void onCreate Bundle sav
  • FragmentActivity 无法解析为类型

    我正在尝试来自的应用程序这个博客 http android developers blogspot com 2011 02 android 30 fragments api html 在延长的同时FragmentActivity 我收到以下
  • 如何在 60 分钟后删除共享首选项

    我想存储登录数据 但希望在 60 分钟后删除该数据 执行此操作的正确方法是什么 在这 60 分钟内可以关闭 停止 打开应用程序 我不想使用内部数据库 这是我的访问代码SharedPreferences sharedpreferences g
  • Android 操作项上的通知徽章

    我想在操作栏中放置的购物车图像上添加一个通知徽章 并以编程方式操作它 有帮助吗 您可以显示自定义MenuItem on ActionBar通过创建一个custom layout for MenuItem 要设置自定义布局 您必须使用菜单项属
  • 如何使用 Jersey 将嵌套列表封送为 JSON?我得到一个空数组或一个包含数组的单元素字典数组

    我正在开发一个使用 Jersey 将对象转换为 JSON 的项目 我希望能够写出嵌套列表 如下所示 data one two three a b c 我想要转换的对象首先将数据表示为 gt gt 我认为 Jersey 会做正确的事情 以上输
  • 如何将 JSON 数据从 Android 发送到 php url?

    我想将登录信息从我的应用程序发送到 php url 因为这我的应用程序将崩溃 任何人都可以帮助我解决这个问题 这是我的服务器登录方法 我想将数据发送到此登录方法 Method public method login Parameters 3
  • 了解应用程序在后台时何时收到 Firebase 消息

    我知道这个标题有同样的问题 但不幸的是它没有得到正确的回答 它被接受了 here https stackoverflow com questions 37711082 how to handle notification when app
  • 使 Recyclerview 固定高度并可滚动

    已解决以下检查答案 所以我试图为我的 Android 应用程序创建评论功能 我想在 recyclerview 中显示评论 然后在 recyclerview 下方有一个按钮和文本视图来添加评论 我想让 recyclerview 具有一定的高度
  • 如何在具有现有记录的 json 数据表顶部添加新行

    我试图在数据表顶部添加一行 显示 金额 列的总和 我正在使用 json 数据表 jquery 插件 列表来显示数据表 如何将此行与现有行一起添加到数据表顶部 我认为这段代码会对你有所帮助 var json uid user123 first
  • 调试android数据绑定?

    谁能告诉我如何调试或找到数据绑定生成的代码 从this https www youtube com watch v NBbeQMOcnZ0链接我发现它生成了所需的代码 我猜您正在寻找自动生成的绑定 java 文件 我也在寻找他们 最后我在这
  • Android 从通知刷新 Activity

    我有一个程序 我在其中调用通知 如果您将其下拉 该通知将启动一个新活动 mNotificationManager NotificationManager getSystemService ns int icon R drawable sta
  • 动态更改按钮上的图像视图

    在我的应用程序中 我有按钮和ImageView 当我按下按钮时我想改变ImageView 我的可绘制文件夹中有 5 张图像 按下按钮时 ImageView 根据按钮单击一张一张地更改图像 我想要它的解决方案 感谢任何可以提供帮助的人 维护一
  • 如何从DataSource.Factory获取数据

    我必须调用此方法才能获取所有人员 我根本无法修改这个方法 Query SELECT FROM PERSON TABLE ORDER BY NAME DESC abstract fun getElements DataSource Facto
  • 如何正确处理 ListView 内的 Android EditText 输入?

    在我的应用程序中 我有一个在 a 中添加 删除 编辑记录的活动SortedMap 该活动作为以下活动的延伸实施ListActivity 我已经实现了自定义ArrayAdapter对于收藏品 Every ListView项目 对应于基础记录
  • 如何用LoaderManager自动重新查询

    我有一个应用程序显示来自 SQLite DB 的数据 并且数据不断变化 所以显然 我认为我应该使用 LoaderManager 来显示数据 我读过一些关于将 LoaderManager 与 SQLite 结合使用的内容 然后看到了亚历克斯

随机推荐