如何在 Moshi 中使用带有接口的 PolymorphicJsonAdapterFactory?
How to use PolymorphicJsonAdapterFactory with an interface in Moshi?
作为我的模型的一部分,我有一个包含两种具体类型的接口,我想 serialize/deserialize 使用 Moshi。我的问题是我不完全理解 PolymorphicJsonAdapterFactory 是否真的适用于我的用例。我查看了示例和一些博客文章,并且(如果我理解正确的话)所有这些似乎都指向一个事实,即您的界面应该在界面中有一个字段,允许您确定类型.我在现有的代码库中工作,因此我无法轻松添加一个字段来让我通过一些字符串文字来确定它是什么类型。
这是我的 Moshi 代码所在的位置,我正在寻求验证我是否正确使用 PolymorphicJsonAdapterFactory。注意:我对代码的 moshi 部分和我的模型使用 java。我的界面及其具体类型在 kotlin
中
String json = ...;
Moshi moshi = new Moshi.Builder()
.add(PolymorphicJsonAdapterFactory.of(PersonInterface.java, "")
.withSubtype(BusinessPerson.java, "occupation")
.withSubtype(PolicePerson.java, "rank")
)
.build();
JsonAdapter<MyModel> jsonAdapter = moshi.adapter(MyModel.class);
MyModel myModel = jsonAdapter.fromJson(json);
注意:我将 java 用于代码的 moshi 部分和我的模型。我的界面及其具体类型在 kotlin
中
MyModel
定义如下
class MyModel {
String month;
PersonInterface person;
}
我在 kotlin 中的界面和具体 类:
Interface PersonInterface {
val personsName: String?
}
data class BusinessPerson(
override val personsName: String,
val occupation: String?
) : PersonInterface
data class PolicePerson(
override val personsName: String,
val rank: String?
) : PersonInterface
目标是希望 Moshi 能够创建一个
class MyModel {
String month;
BusinessPerson person;
}
或
class MyModel {
String month;
PolicePerson person;
}
取决于人员字段是否包含 occupation
(这意味着它是 BusinessPerson 类型)或者它是否包含字段 rank
(这意味着它是 PolicePerson 类型)。
PolymorphicJsonAdapterFactory.of(PersonInterface.java, "")
.withSubtype(BusinessPerson.java, "occupation")
.withSubtype(PolicePerson.java, "rank")
意味着每个人的 JSON 应该包含一个键 ""
并且 "occupation"
或 "rank"
是这个键的值,而不是键名本身如你所愿。所以例如它会编码一个
BusinessPerson("John", "CEO")
作为
{"": "occupation", "personsName": "John", "occupation": "CEO"}
我认为如果您想避免鉴别器字段,您必须为此用例编写自己的适配器工厂。
作为我的模型的一部分,我有一个包含两种具体类型的接口,我想 serialize/deserialize 使用 Moshi。我的问题是我不完全理解 PolymorphicJsonAdapterFactory 是否真的适用于我的用例。我查看了示例和一些博客文章,并且(如果我理解正确的话)所有这些似乎都指向一个事实,即您的界面应该在界面中有一个字段,允许您确定类型.我在现有的代码库中工作,因此我无法轻松添加一个字段来让我通过一些字符串文字来确定它是什么类型。
这是我的 Moshi 代码所在的位置,我正在寻求验证我是否正确使用 PolymorphicJsonAdapterFactory。注意:我对代码的 moshi 部分和我的模型使用 java。我的界面及其具体类型在 kotlin
中String json = ...;
Moshi moshi = new Moshi.Builder()
.add(PolymorphicJsonAdapterFactory.of(PersonInterface.java, "")
.withSubtype(BusinessPerson.java, "occupation")
.withSubtype(PolicePerson.java, "rank")
)
.build();
JsonAdapter<MyModel> jsonAdapter = moshi.adapter(MyModel.class);
MyModel myModel = jsonAdapter.fromJson(json);
注意:我将 java 用于代码的 moshi 部分和我的模型。我的界面及其具体类型在 kotlin
中MyModel
定义如下
class MyModel {
String month;
PersonInterface person;
}
我在 kotlin 中的界面和具体 类:
Interface PersonInterface {
val personsName: String?
}
data class BusinessPerson(
override val personsName: String,
val occupation: String?
) : PersonInterface
data class PolicePerson(
override val personsName: String,
val rank: String?
) : PersonInterface
目标是希望 Moshi 能够创建一个
class MyModel {
String month;
BusinessPerson person;
}
或
class MyModel {
String month;
PolicePerson person;
}
取决于人员字段是否包含 occupation
(这意味着它是 BusinessPerson 类型)或者它是否包含字段 rank
(这意味着它是 PolicePerson 类型)。
PolymorphicJsonAdapterFactory.of(PersonInterface.java, "")
.withSubtype(BusinessPerson.java, "occupation")
.withSubtype(PolicePerson.java, "rank")
意味着每个人的 JSON 应该包含一个键 ""
并且 "occupation"
或 "rank"
是这个键的值,而不是键名本身如你所愿。所以例如它会编码一个
BusinessPerson("John", "CEO")
作为
{"": "occupation", "personsName": "John", "occupation": "CEO"}
我认为如果您想避免鉴别器字段,您必须为此用例编写自己的适配器工厂。