android - 如何在 Moshi 中跳过 JSON 属性?
问题描述
我正在尝试使用com.squareup.moshi
(v1.10.0)在我用 Kotlin 编写的 Android 应用程序中实现 JSON 解析。
在 JSON 文件中,有一些对我来说并不有趣的属性。比方说,我只需要能够在地图上标记地点的位置,JSON 如下所示:
"location":{
"address":{
"country":"..."
},
"position":{
"lat":47.469866,
"lon":19.062435
}
}
如果我是对的,如果我想解析 JSON,Kotlin 中的数据类应该是这样的:
@Parcelize
data class Location(
val address: Address,
val position: Position
): Parcelable
@Parcelize
data class Address(
val country: String
): Parcelable
@Parcelize
data class Position(
val lat: Double,
val lon: Double
): Parcelable
在Moshi 的文档中,我可以找到transient
关键字来跳过在 Kotlin 中用作注释 ( @Transient
) 的值。正如文档所说:
编写 JSON 时省略瞬态字段。读取 JSON 时,即使 JSON 包含该字段的值,也会跳过该字段。相反,它将获得一个默认值。
这是否意味着如果我不想拥有地址对象,我应该使用以下代码?
@Parcelize
data class Location(
@Transient val address: Address? = null,
val position: Position
): Parcelable
另外,一般情况下呢?如果我在 JSON 对象中有大量属性,但我知道我只需要“位置”对象怎么办?我还需要创建null
值来逐字段解析 JSON 文件吗?
解决方案
我认为您正在寻找类似于 GSON 的@Expose
annotations的东西,其中所有模型字段都被排除在解析之外,除了那些带注释的字段。
此功能目前在 Moshi 中不可用,因此您当前使用@Transient
注释的实现似乎是最佳解决方案。(请参阅此处的 Moshi 问题对话。)
额外的思考:
@IgnoredOnParcel
由于您正在实现parcelable
接口,因此您可能还希望在瞬态字段上使用。(在这里查看一些实现指针。)
或者,您可以将数据模型分成 2 个模型 - 一个用于您的应用程序,一个反映服务器 (JSON) 模式(就像您在上面所做的那样)。您的应用程序(可以实现 parcelable)的主要数据模型将仅包含您使用的字段(例如,位置字段)。当您解析数据时,然后使用一些简单的适配器将该数据转换为您的主要数据模型。(无论如何,这通常是一种很好的做法,因为服务器端模式是固有的更改。这样,JSON 模式中的任何更改都不会在整个代码中产生任何连锁反应。)
推荐阅读
- python - 仅当出现在特定模式之后的字符才从 HTML 字符串中删除
- node.js - 访问令牌与刷新令牌 NodeJS
- angular - 离子/角度ngFor和点击功能
- java - 如何从 MYSQL 存储过程中调用 Java 文件?
- asp.net - 带有必需字段验证器的 AJAX 手风琴崩溃
- node.js - 如何优化firebase函数的响应速度
- ldap - 389 目录服务器创建vlv索引而不停止服务器?
- c++ - 未能优化看似明显的循环不变量(但 volatile 限定符确实有魔力)
- sql - 带有 NULL 的单个表结果的 SQL 子查询
- android - 关闭应用程序时,Internet Connection Changed Broadcast Receiver 未执行