GWT JsType 数组转换
GWT JsType array casting
当我有 JSON 对象时:
{
"asset": {
"properties": [{
"name": "xxx",
"id": "yy"
}]
}
}
然后我有这样的 JsInterop 包装器:
@JsType
public class Asset {
@JsProperty
public native jsinterop.base.JsArrayLike<Property> getProperties();
}
和:
@JsType
public class Property {
@JsProperty
public native String getName();
@JsProperty
public native String getId();
}
当我在代码的某处尝试访问数据时,当我尝试访问 属性 对象的属性时失败。
例如:
Asset asset = dataProvider.getAssets();
console.log(assets) //works ok: => {"properties":Array(1)}
console.log(asset.getProperties()) //works ok: => Array(1)
console.log(asset.getProperties().getAt(0)) //works ok: => {"name":"xxx","id":"yy"}
console.log(asset.getProperties().getAt(0).getName() //does not work: => Uncaught exception: undefined
或者如果我制作资产并且 属性 class (isNative=true):
Uncaught exception: Cannot read property "company" of undefined.
我检查过,如果我在尝试获取名称或 ID 时编译应用程序,代码会编译为:
castTo(asset.properties[0], 125)
或者如果(isNative=true):
castToNative(asset.properties[0], $wnd.com.company.project.Property)
首先我认为这是因为我实现了数组的包装器,但我发现了 "jsinterop.base.JsArrayLike",所以我认为这会解决我的问题,但错误仍然存在。我错过了什么吗?我真的很想使用 JsInterop 而不是 JSNI 方法和覆盖类型,但我无法通过这些数组。
当您处理来自 JSON 的数据时,您会得到普通的旧 Object
和 Array
对象。所以你需要使用
@JsType(isNative=true, namespace=JsPackage.GLOBAL, name="Object")
或您可以改用接口,它不会进行强制转换和类型检查。
当我有 JSON 对象时:
{
"asset": {
"properties": [{
"name": "xxx",
"id": "yy"
}]
}
}
然后我有这样的 JsInterop 包装器:
@JsType
public class Asset {
@JsProperty
public native jsinterop.base.JsArrayLike<Property> getProperties();
}
和:
@JsType
public class Property {
@JsProperty
public native String getName();
@JsProperty
public native String getId();
}
当我在代码的某处尝试访问数据时,当我尝试访问 属性 对象的属性时失败。
例如:
Asset asset = dataProvider.getAssets();
console.log(assets) //works ok: => {"properties":Array(1)}
console.log(asset.getProperties()) //works ok: => Array(1)
console.log(asset.getProperties().getAt(0)) //works ok: => {"name":"xxx","id":"yy"}
console.log(asset.getProperties().getAt(0).getName() //does not work: => Uncaught exception: undefined
或者如果我制作资产并且 属性 class (isNative=true):
Uncaught exception: Cannot read property "company" of undefined.
我检查过,如果我在尝试获取名称或 ID 时编译应用程序,代码会编译为:
castTo(asset.properties[0], 125)
或者如果(isNative=true):
castToNative(asset.properties[0], $wnd.com.company.project.Property)
首先我认为这是因为我实现了数组的包装器,但我发现了 "jsinterop.base.JsArrayLike",所以我认为这会解决我的问题,但错误仍然存在。我错过了什么吗?我真的很想使用 JsInterop 而不是 JSNI 方法和覆盖类型,但我无法通过这些数组。
当您处理来自 JSON 的数据时,您会得到普通的旧 Object
和 Array
对象。所以你需要使用
@JsType(isNative=true, namespace=JsPackage.GLOBAL, name="Object")
或您可以改用接口,它不会进行强制转换和类型检查。