如何将JavaScript对象投射到Kotlin对象?
我收到一个JavaScript对象来响应远程HTTP请求。 我有一个kotlin模型(trait),它定义了我期望的对象的各个字段(可为空的字段是可选的)。
首先,我想做一个检查,以确保我的对象实际上是预期的类型。 我最初尝试的payload is MyModel
但是由于is
运算符写在kotlin.js中的方式不起作用。
其次,我想投射到MyModel
这样我就可以在对象上自动完成等等。 通常情况下,只有这样就足够了,但是既然不行,我也需要这个问题。
我想避免手动从dynamic
填充我的对象。 我不介意这么做,如果我可以使用by Delegates.mapVal(...)
但需要一个Map<String, Any?>
,我不知道如何让我的dynamic
/ Any?
有效载荷到Map<String, Any?>
。
1)由于性能原因,我们没有进行结构检查。 我不确定我们是否需要通用解决方案,但无论如何,我都会为此创建问题 ,随意投票或为其获取更新。
2) is
足够了,如果你使用聪明的演员 ,就像:
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) }
但它看起来太冗长了,但是你可以添加额外的逻辑,例如当数据没有请求字段时。 如果你不需要自定义逻辑,我认为演员就足够了。
对于第二部分,演员,你可以这样做:
fun responseHandler(payload: dynamic) { val myModel = payload as MyModel }
要么
fun responseHandler(payload: dynamic) { val myModel: MyModel = payload }
如果有效载荷为空,这将会抛出一个NPE,但是实际上不会验证有效载荷是否与MyModel匹配。 特别是,如果有效载荷遗漏了这些字段/属性,那么最终可能会得到空字段/属性。