1

我想将一个 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 代码在 Kotlin 上获取 JavaScript 对象。

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 类?

4

3 回答 3

2

使用JSON.parsekotlinx.serialization库而不是KotlinJSON.parse /JS 标准库。

Kotlin 标准库中的JSON只是围绕 JavaScript JSON 对象的一个​​视图。因此JSON.parse创建了没有任何关于 Kotlin 类型信息的常规 JS 对象。

可以将它与无法进行类型检查的外部类一起使用。但是你MyClass是普通班。

从常规 Kotlin 类构造的对象具有特殊的元数据,这对于类型检查myClass is MyClass和反射至关重要myClass::class == MyClass::class。并且kotlinx.serialization库创建了这些功能齐全的 Kotlin 对象。

于 2018-10-01T20:48:48.233 回答
0

试试这个检查:

myClass::class == MyClass::class
于 2018-09-15T04:25:09.383 回答
0

这可能会有所帮助:

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)
}
于 2018-11-13T12:54:49.093 回答