如何将JavaScript对象转换为Kotlin对象?

时间:2015-02-16 06:10:40

标签: kotlin

我收到了一个JavaScript对象以响应远程HTTP请求。我有一个kotlin模型(trait),它定义了我期望在对象上的各种字段(可空的字段是可选的)。

首先,我想进行is检查,以确保我的对象实际上是预期的类型。我最初尝试过payload is MyModel,但由于{k}在kotlin.js中编写is运算符的方式,因此无效。

其次,我想要转换为MyModel,以便在我使用它时可以在对象上获得自动完成等。通常情况下,仅is就足够了,但由于这不起作用,我也需要解决这个问题。

我想避免从dynamic手动填充我的对象。我不介意这么做,如果我可以使用by Delegates.mapVal(...),但这需要Map<String, Any?>而且我不知道如何将我的dynamic / Any?有效负载放入Map<String, Any?>

2 个答案:

答案 0 :(得分:3)

1)由于性能原因,我们没有is的结构检查。 我不确定我们是否需要通用的解决方案,但无论如何我创建了issue about it,随时投票或加星标以获得更新。

2)is如果您使用smart cast就足够了,例如:

if (payload is MyModel) {
// call MyModel members on payload
}

但不要忘记(1):)

3)你可以这样写:

class MapDynamic<out V>(val d: dynamic) {
  public fun get(thisRef: Any, desc: PropertyMetadata): V {
        return d[desc.name]
    }
}

class Foo(data: dynamic) {
  val field: Int by MapDynamic(data)
}

fun main(args : Array<String>) {
  val f = Foo(object { val field = 123 })
  println(f.field)
}

但它看起来过于冗长,但您可以添加额外的逻辑,例如当数据没有请求字段时。如果你不需要自定义逻辑,我认为演员就足够了。

答案 1 :(得分:0)

对于演员的第二部分,您可以这样做:

fun responseHandler(payload: dynamic) {
    val myModel = payload as MyModel
}

fun responseHandler(payload: dynamic) {
    val myModel: MyModel = payload
}

如果有效负载为空,这将抛出NPE,但它实际上不会验证有效负载是否与MyModel匹配。特别是,如果有效负载缺少那些字段/属性,则最终可能不会出现空字段/属性。