2015-03-19 49 views
5

我想在JavaScript代碼中生成一個數據結構,並從Java(Rhino 6或7)中處理結果。如何將Rhino生成的JSON數據結構(NativeObject)轉換爲Java數據結構?

我成功地將調用從Java的JS功能:

Object result = invocableEngine.invokeFunction(functionName, parameters); 

現在,JS的一面,這個結果是一個JSON數據結構如下:

{ 
    "key1" : { "key1_1" : "value1_1", "key1_2" : 11 }, 

    "key2" : [ { "key2_1": "foo2" 
       , "key2_1" : "bar2" }, 

      { "key2_1": "foo2" 
       , "key2_1" : "bar2" 
       , "key2_3" : [1,2,3] } ] 
} 

在Java方面,然而,「結果」是類型的對象sun.org.mozilla.javascript.internal.NativeObject

有沒有辦法讓我把它轉換成合理的Java數據結構,而沒有將該JSON序列化爲字符串,然後使用Gson解析它的開銷?

假定數據結構合理定義好的時刻例如, 我知道這個對象是一個帶有鍵「key1」和「key2」的散列,第一個映射到帶有鍵「key1_1」和「key1_2」的散列。第二個映射到哈希數組,每個哈希都有標量鍵「key2_1」和「key2_2」,以及數組「key2_3」。

我2個重點是,按照這個順序:

  1. 性能(這就是爲什麼我很警惕連載+ GSON-解析的)
  2. 的Java 6,7和8(但之間
  3. 可移植性,我更喜歡速度更快的非便攜式解決方案)。
+0

是有問題,把它留在犀牛格式,並通過數據訪問它結構體?我認識到它會有一些開銷,但我不認爲沒有轉換爲字符串和反序列化就沒有任何替代方案。 – ghostbust555 2015-03-19 15:09:24

+0

@ ghostbust555 - 我認爲「通過Rhino格式訪問」是一種有效的方法,但不知道如何做到這一點。似乎沒有任何像樣的文檔可以找到,尤其是對於散列號 – DVK 2015-03-19 15:12:08

+0

呵呵。哇,他們只是有史以來最糟糕的文件。試試result.getAttributes(「key1」)? – ghostbust555 2015-03-19 15:27:55

回答

0

您可以通過解析成一個LinkedTreeMap,這樣解析任何JSON字符串「對象」使用Gson

import com.google.gson.internal.LinkedTreeMap; 

String json = <your raw json> 
LinkedTreeMap map = new Gson().fromJson(json, LinkedTreeMap.class); 

解析您的樣品輸入後,這裏有一個如何使用它的一個例子:

System.out.println(((List<LinkedTreeMap>)map.get("key2")).get(1).get("key2_3")); 

輸出:

[1.0, 2.0, 3.0] 

它有助於事先了解結構,但不是必需的,因爲您可以根據需要檢查每個節點的類型。

至於性能,我創建了4個鍵的樣本輸入,每個鍵在列表中有超過400個條目。在JVM發出警告之後,解析僅用了2毫秒就在我的低規格筆記本電腦上。

0

您可以從json內部構建java對象。

像這樣的東西(我構建新java.lang.String中,但同樣可以構建自己的類):

java -jar js.jar 
Rhino 1.7 release 5 2015 01 29 
js> str=new java.lang.String("Hello world") 
Hello world 
js> java.lang.System.out.println(str) 
Hello world