2013-04-18 39 views
1

我正在尝试处理来自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方法。其他一切都是黑匣子。

谢谢!

回答

0

我在Scala也有这个问题。 NativeObject支持2个get方法get(int,Scritable)和get(string,Scriptable)。所以,如果一个属性键是一个数字字符串,我把它转换成int和使用get(INT,yourObject)

http://www.jarvana.com/jarvana/view/org/mozilla/rhino/1.7R3/rhino-1.7R3-javadoc.jar!/org/mozilla/javascript/ScriptableObject.html#get%28int,%20org.mozilla.javascript.Scriptable%29

+0

这可能是解决问题的办法。我解决这个问题的方法是在密钥前面添加一个** $ **,从而将它变成一个字符串。我将不得不检查您的解决方案是否也适用。 – gookman

+0

你说得对。这是正确的解决方案。 – gookman

相关问题