Вы можете сделать это, используя InstanceCreator
.Мой пример на Java (и немного другой случай, чтобы показать возможности), но думаю, что вы можете выбрать соответствующую информацию в свой проект Kotlin.
Предположим, у вас есть такой класс:
@Getter
public class MyClass {
private String name;
private String myData;
public void init(String myData) {
this.myData = myData;
}
}
Тогда у вас будет test.json вроде:
{
"name": "My Name",
"myData": "My Data"
}
Чтобы десериализовать myData как какое-либо другое значение или выполнить любую другую инициализацию на этапе десериализации, которую вы можетезарегистрируйте InstanceCreator
, который будет выглядеть так:
public class MyInstanceCreator implements InstanceCreator<MyClass>{
@Override
public MyClass createInstance(Type type) {
MyClass myClass = new MyClass();
myClass.init("Instance creator put this data");
return myClass;
}
}
Десериализация как:
@Test
public void test() {
Gson gson = new GsonBuilder().setPrettyPrinting()
.registerTypeAdapter(MyClass.class, new MyInstanceCreator())
.create();
MyClass myClass = gson.fromJson(
new InputStreamReader(getClass()
.getResourceAsStream("test.json")),
MyClass.class);
log.info("\n{}", gson.toJson(myClass));
}
приведет к объекту как:
{
"name": "My Name",
"createdBy": "Instance creator put this data"
}