У меня есть интерфейс с двумя конкретными типами как часть моей модели, которую я хотел бы сериализовать/десериализовать с помощью Moshi. Моя проблема в том, что я не совсем понимаю, действительно ли PolymorphicJsonAdapterFactory предназначен для моего варианта использования. Я просмотрел образцы и несколько сообщений в блогах, и (если я правильно их понимаю) все они, похоже, указывают на тот факт, что ваш интерфейс должен иметь поле в интерфейсе, которое позволяет вам определить тип . Я работаю в существующей кодовой базе, и поэтому я не могу легко добавить поле, которое позволило бы мне выяснить, к какому типу оно относится, по какому-то строковому литералу.
Вот где я нахожусь со своим кодом Moshi, и я ищу подтверждение того, правильно ли я использую PolymorphicJsonAdapterFactory. Примечание. Я использую 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 для моши-части кода и для своей модели. Мой интерфейс и его конкретные типы в 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
Цель состоит в том, чтобы Моши мог создать
class MyModel {
String month;
BusinessPerson person;
}
or a
class MyModel {
String month;
PolicePerson person;
}
в зависимости от того, содержит ли поле человека occupation
(что означает, что оно имеет тип BusinessPerson) или содержит ли оно поле rank
(что означает, что оно имеет тип PolicePerson).