Насколько я знаю, нет.
Проблема
Kotlin.JS создает невероятно странную ситуацию типа при десериализации с использованием встроенного класса JSON, который на самом деле является зеркалом для класса JSON JavaScript . Хотя я не сделал много JavaScript, его тип обработки почти не существует. Только ручные броски могут применить его, поэтому JSON.parse
не волнует, возвращает ли он SomeCustomObject
или вновь созданный объект с точно такими же полями.
В качестве примера этого, если у вас есть два разных класса с одинаковыми именами полей (без наследования), и у вас есть функция, которая принимает переменную, не имеет значения, какой из них (или третий в этом отношении) он получает, пока существуют переменные, к которым он пытается получить доступ в классе.
Проблемы с типами проявляются в Kotlin. Теперь вернемся к Kotlin, рассмотрим этот код:
val json = """{
"x": 1, "y": "yes", "z": {
"x": 42, "y": 314159, "z": 444
}
}""".trimIndent()
data class SomeClass(val x: Int, val y: String, val z: Struct)
data class Struct(val x: Int, val y: Int, val z: Int)
fun main(args: Array<String>) {
val someInstance = JSON.parse<SomeClass>(json)
if(someInstance.z::class != Struct::class) {
println("Incompatible types: Required ${Struct::class}, found ${someInstance.z::class}");
}
}
Что вы ожидаете, что это напечатает? Естественно было бы ожидать Struct
. Тип также явно объявлен
К сожалению, это не так. Вместо этого он печатает:
Incompatible types: Required class Struct, found class Any
Точка
Встроенный JSON de / serializer не подходит для типов. Возможно, вы сможете исправить это с помощью другой библиотеки сериализации, но я не буду превращать это в «библиотеку use [this]».
По сути, JSON.parse
не может выполнить синтаксический анализ объектов, как ожидалось. Если вы полностью удалите аргументы и попробуете необработанный JSON.parse(json);
для JSON в своем вопросе, вы получите role
, то есть String
, а не Role
, что вы можете ожидать. А JSON.parse
не выполняет преобразование типов, что означает, что у вас есть два варианта: использовать библиотеку или использовать ваш подход.
Ваш подход, к сожалению, усложняется, если у вас есть вложенные объекты, но при изменении типов единственная опция, которую вы, похоже, оставили, это явный анализ объектов вручную.
TL; DR: Ваш подход в порядке.