Как JavaScript объект для класса Kotlin? - PullRequest
0 голосов
/ 15 сентября 2018

Я хочу загрузить объект JavaScript в класс Kotlin. В качестве проверки безопасности мне нужно убедиться, что объект Kotlin на самом деле является классом, который я создал, потому что некоторые части кода JavaScript не являются моим проектом. Мне нужно, чтобы JavaScript возвращался правильно, но я не могу проверить класс Kotlin.

например.

объект JavaScript

<script id="myJS">
function MyClass(id, name){
    var obj = {};
    obj.id = id;
    obj.name = name;

    return obj;
}
var myClass = MyClass(0, "name_0");
</script>

Kotlin класс

class MyClass(
            val id: Int,
            val name: String
)

Я использую этот код Kotlin для получения объекта JavaScript на Kotlin.

val myJS: dynamic = document.getElementById("myJS")
val myClass: MyClass = JSON.parse<MyClass>(JSON.stringify(myJS.myClass))//get JavaScript object
println(myClass.id)//success output "0"
println(myClass.name)//success output "name_0"

println(myClass is MyClass)//but check class this output "false"

Как я могу проверить, что объект JavaScript - это созданный класс Kotlin?

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Используйте JSON.parse из библиотеки kotlinx.serial вместо JSON.parse из стандартной библиотеки Kotlin / JS.

JSON из стандартной библиотеки Kotlin - это просто представление JavaScript JSON-объект . Таким образом, JSON.parse создает обычный объект JS без какой-либо информации о типе Kotlin.

Хорошо использовать его с внешними классами, которые нельзя проверить типом. Но ваш MyClass обычный класс.

Объекты, построенные из обычных классов Kotlin, имеют специальные метаданные, которые необходимы для проверки типов myClass is MyClass и отражения myClass::class == MyClass::class. И библиотека kotlinx.serialization создает эти полнофункциональные объекты Kotlin.

0 голосов
/ 13 ноября 2018

Это может быть полезно:

class MyClass(val id: Int, val name: String) {
    constructor(obj: dynamic): this(obj.id, obj.name)

    override fun toString(): String = 
        "${this.id} ${this.name}"
}

fun main() {

    val obj  = js("{}")
    obj.id   = 1
    obj.name = "Mike"

    val myObj = MyClass(obj)
    println(myObj)
    println(myObj is MyClass)
}
0 голосов
/ 15 сентября 2018

Попробуйте эту проверку:

myClass::class == MyClass::class
...