我正在尝试处理来自NativeObject
的数据,但我发现了对象属性命名的一个小问题。该对象的JavaScript代码是:
var mainObject = {
"innerObject" : {
"234" : {
"property1" : "1",
"property2" : "2"
}
}
}
我用Java处理它的方法如下:
public void processNative(NativeObject obj) {
if(NativeObject.hasProperty(obj, "innerObject")) {
NativeObject no = (NativeObject)NativeObject.getProperty(obj, "innerObject");
Object[] propIds = NativeObject.getPropertyIds(no);
for (int i = 0; i < propIds.length; i++) {
String key = propIds[i].toString();
NativeObject numObj = (NativeObject)NativeObject.getProperty(no, key);
//do more processing here
}
}
}
此代码将抛出此异常:java.lang.ClassCastException: org.mozilla.javascript.UniqueTag cannot be cast to org.mozilla.javascript.NativeObject
。
如果我转换为UniqueTag
我实际上可以获得正确的值,在这种情况下将为UniqueTag.NOT_FOUND
。
我觉得这有点令人困惑,因为我从对象本身获取了属性键,它实际上存在于JavaScript代码中。
如果我将对象的名称从“234”更改为“car”,则代码按预期工作,因此我假设命名存在问题。从这个post我明白属性名称可以是任何类型的字符串,因此使用由数字组成的字符串应该没有问题。
所以我想一个后续问题是:我有没有办法解决这个问题而无需重命名?
我需要提到的另一件事是我只能访问JavaScript代码和Java方法。其他一切都是黑盒子。
谢谢!
答案 0 :(得分:0)
我也在Scala中遇到过这个问题。 NativeObject支持2个get方法get(int,Scritable)和get(string,Scriptable)。因此,如果属性键是数字字符串,我将其转换为int并使用get(int,yourObject)