【问题标题】:How to JavaScript object to Kotlin class?如何将 JavaScript 对象转换为 Kotlin 类?
【发布时间】:2019-02-19 19:42:39
【问题描述】:

我想将一个 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 类?

【问题讨论】:

    标签: javascript class kotlin kotlin-js-interop kotlin-js


    【解决方案1】:

    使用 kotlinx.serialization 库中的 JSON.parse,而不是 Kotlin/JS 标准库中的 JSON.parse

    来自 Kotlin 标准库的JSON 只是围绕 JavaScript JSON object 的一个视图。所以JSON.parse 创建了一个没有任何 Kotlin 类型信息的常规 JS 对象。

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

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

    【讨论】:

      【解决方案2】:

      试试这个检查:

      myClass::class == MyClass::class
      

      【讨论】:

      • 同样的输出“假”
      • println(myClass::class)//这个输出“class Any”
      • println(MyClass::class)//这个输出“class MyClass”
      • 啊,也许试试 ::class.java 并以这种方式进行比较。如果这不起作用,您可能需要使用 Moshi medium.com/@BladeCoder/… 之类的东西
      【解决方案3】:

      这可能会有所帮助:

      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)
      }
      

      【讨论】:

      • 我试试 obj.id="Mike" 。它将是 println(myObj is MyClass) 输出“true”。但是,println(myObj.id) 输出“Mike”,而 println(myObj.id is Int) 输出“false”。我尝试 if then 或 obj.id=null 。它将是 println(myObj is MyClass) 输出“true”。但是,println(myObj.id) 输出 null 而 println(myObj.id is Int) 输出“false”。
      • 将 MyClass 主 ctor 更改为 null 感知字段:class MyClass(val id: Int?, val name: String?) 但必须对您的班级成员进行 null 检查...
      • 附注您使用的是什么编译器版本,有哪些选项?
      • Kotlin 编译器版本 1.3
      猜你喜欢
      • 2021-01-23
      • 2021-12-17
      • 2019-08-04
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      相关资源
      最近更新 更多