我正在尝试处理来自NativeObject
的数据,但我发现了一个与对象属性命名有关的小问题。为对象的JavaScript代码是:Rhino接受对象属性的有效名称是什么?
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方法。其他一切都是黑匣子。
谢谢!
这可能是解决问题的办法。我解决这个问题的方法是在密钥前面添加一个** $ **,从而将它变成一个字符串。我将不得不检查您的解决方案是否也适用。 – gookman
你说得对。这是正确的解决方案。 – gookman