gpt4 book ai didi

java - 如何在 Moshi 中将 PolymorphicJsonAdapterFactory 与接口(interface)一起使用?

转载 作者:行者123 更新时间:2023-12-02 01:10:08 26 4
gpt4 key购买 nike

我有一个包含两种具体类型的接口(interface),作为我的模型的一部分,我想使用 Moshi 对其进行序列化/反序列化。我的问题是,我不完全理解 PolymorphicJsonAdapterFactory 是否真的适合我的用例。我查看了示例和一些博客文章,(如果我理解正确的话)所有这些似乎都指出了这样一个事实:您的界面应该在界面中有一个字段,允许您确定类型。我正在现有的代码库中工作,因此我无法轻松添加一个字段来让我通过某些字符串文字找出它的类型。

这就是我的 Moshi 代码所在的位置,我正在寻求验证我是否正确使用了 PolymorphicJsonAdapterFactory。注意:我使用 java 来处理代码的 moshi 部分和我的模型。我的界面及其具体类型在 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)和具体类:

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;
}

取决于人员字段是否包含职业(这意味着它的类型为 BusinessPerson),或者是否包含字段rank(这意味着它的类型为 PolicePerson) )。

最佳答案

PolymorphicJsonAdapterFactory.of(PersonInterface.java, "")
.withSubtype(BusinessPerson.java, "occupation")
.withSubtype(PolicePerson.java, "rank")

意味着每个人的 JSON 都应该包含一个键 "" ,而 "职业""rank" 是这个键,而不是您想要的键名称本身。所以例如它会编码一个

BusinessPerson("John", "CEO")

作为

{"": "occupation", "personsName": "John", "occupation": "CEO"}

如果您想避免鉴别器字段,我认为您必须为此用例编写自己的适配器工厂。

关于java - 如何在 Moshi 中将 PolymorphicJsonAdapterFactory 与接口(interface)一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59526985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com