1

我正在尝试处理来自 a 的数据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.

如果我转换为 aUniqueTag我实际上可以获得正确的值,在这种情况下将是UniqueTag.NOT_FOUND.

我发现这有点令人困惑,因为我从对象本身获取属性键,并且它实际上存在于 JavaScript 代码中。

如果我将对象的名称从“234”更改为“car”,代码会按预期工作,所以我假设命名存在问题。从这篇文章中我了解到属性名称可以是任何类型的字符串,因此使用数字组成的字符串应该没有问题。

所以我想一个后续问题是:有没有办法让我解决这个问题而不必重命名?

我需要提到的另一件事是我只能访问 JavaScript 代码和 Java 方法。其他一切都是黑匣子。

谢谢!

4

1 回答 1

0

我在 Scala 中也遇到过这个问题。NativeObject 支持 2 种获取方法 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

于 2013-06-14T02:24:39.020 回答