2013-04-18 72 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

相關問題