如何在 Moshi 中跳过 JSON 属性?
How to skip JSON properties in Moshi?
我正在尝试在使用 com.squareup.moshi
(v1.10.0) 编写的 Android 应用程序中实现 JSON 解析。
在 JSON 文件中有一些属性对我来说并不重要。比方说,我只需要能够在地图上标记位置的位置,JSON 看起来像这样:
"location":{
"address":{
"country":"..."
},
"position":{
"lat":47.469866,
"lon":19.062435
}
}
如果我是对的,如果我想解析 JSON:
,Kotlin 中的数据 class 应该是这样的
@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's documentation 中,我可以找到 transient
关键字来跳过在 Kotlin 中用作注释的值 (@Transient
)。正如文档所说:
Transient fields are omitted when writing JSON. When reading JSON, the field is skipped even if the JSON contains a value for the field. Instead it will get a default value.
是否意味着如果我不想有地址对象,我应该使用下面的代码?
@Parcelize
data class Location(
@Transient val address: Address? = null,
val position: Position
): Parcelable
另外,笼统地说呢?如果我在 JSON 对象中有大量属性列表,但我知道我只需要 'position' 对象怎么办?我还需要创建 null
值来逐字段解析 JSON 文件吗?
我认为您正在寻找与 GSON 的 @Expose
annotations 类似的东西,其中所有模型字段都被排除在解析之外,除了那些被注释的。
此功能当前在 Moshi 中不可用,因此您当前使用 @Transient
注释的实现似乎是最佳解决方案。 (See Moshi issues conversation here.)
额外的思考:
您可能还希望在瞬态字段上使用 @IgnoredOnParcel
,因为您正在实现 parcelable
接口。 (查看 以获取一些实施指南。)
或者,您可以将数据模型分成 2 个模型 - 一个用于您的应用程序,一个反映服务器 (JSON) 架构(就像您在上面所做的那样)。您应用程序的主要数据模型(可以实现 parcelable)将仅包含您使用的字段(例如,位置字段)。当您解析数据时,然后使用一些简单的适配器将该数据转换为您的主要数据模型。 (无论如何,这通常是一种很好的做法,因为 server-side 架构是固有的变化。这样,JSON 架构中的任何更改都不会在整个代码中产生任何连锁反应。)
https://github.com/square/moshi#omit-fields-with-transient
省略具有瞬态的字段
某些模型声明不应包含在 JSON 中的字段。例如,假设我们的 blackjack 手牌有一个 total 字段,其中包含牌的总和:
public final class BlackjackHand {
private int total;
...
}
默认情况下,编码 JSON 时会发出所有字段,解码 JSON 时会接受所有字段。通过添加 Java 的瞬态关键字来防止包含字段:
public final class BlackjackHand {
private transient int total;
...
}
写入 JSON 时省略瞬态字段。读取 JSON 时,即使 JSON 包含该字段的值,也会跳过该字段。相反,它将获得默认值。
我正在尝试在使用 com.squareup.moshi
(v1.10.0) 编写的 Android 应用程序中实现 JSON 解析。
在 JSON 文件中有一些属性对我来说并不重要。比方说,我只需要能够在地图上标记位置的位置,JSON 看起来像这样:
"location":{
"address":{
"country":"..."
},
"position":{
"lat":47.469866,
"lon":19.062435
}
}
如果我是对的,如果我想解析 JSON:
,Kotlin 中的数据 class 应该是这样的 @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's documentation 中,我可以找到 transient
关键字来跳过在 Kotlin 中用作注释的值 (@Transient
)。正如文档所说:
Transient fields are omitted when writing JSON. When reading JSON, the field is skipped even if the JSON contains a value for the field. Instead it will get a default value.
是否意味着如果我不想有地址对象,我应该使用下面的代码?
@Parcelize
data class Location(
@Transient val address: Address? = null,
val position: Position
): Parcelable
另外,笼统地说呢?如果我在 JSON 对象中有大量属性列表,但我知道我只需要 'position' 对象怎么办?我还需要创建 null
值来逐字段解析 JSON 文件吗?
我认为您正在寻找与 GSON 的 @Expose
annotations 类似的东西,其中所有模型字段都被排除在解析之外,除了那些被注释的。
此功能当前在 Moshi 中不可用,因此您当前使用 @Transient
注释的实现似乎是最佳解决方案。 (See Moshi issues conversation here.)
额外的思考:
您可能还希望在瞬态字段上使用 @IgnoredOnParcel
,因为您正在实现 parcelable
接口。 (查看
或者,您可以将数据模型分成 2 个模型 - 一个用于您的应用程序,一个反映服务器 (JSON) 架构(就像您在上面所做的那样)。您应用程序的主要数据模型(可以实现 parcelable)将仅包含您使用的字段(例如,位置字段)。当您解析数据时,然后使用一些简单的适配器将该数据转换为您的主要数据模型。 (无论如何,这通常是一种很好的做法,因为 server-side 架构是固有的变化。这样,JSON 架构中的任何更改都不会在整个代码中产生任何连锁反应。)
https://github.com/square/moshi#omit-fields-with-transient
省略具有瞬态的字段 某些模型声明不应包含在 JSON 中的字段。例如,假设我们的 blackjack 手牌有一个 total 字段,其中包含牌的总和:
public final class BlackjackHand {
private int total;
...
}
默认情况下,编码 JSON 时会发出所有字段,解码 JSON 时会接受所有字段。通过添加 Java 的瞬态关键字来防止包含字段:
public final class BlackjackHand {
private transient int total;
...
}
写入 JSON 时省略瞬态字段。读取 JSON 时,即使 JSON 包含该字段的值,也会跳过该字段。相反,它将获得默认值。