如何将Rhino生成的JSON数据结构(NativeObject)转换为Java数据结构?

DVK*_*DVK 6 java json rhino

我试图在JavaScript代码中生成数据结构,并处理来自Java(Java 6或7中的Rhino)的结果.

我成功地使用Java从Java调用JS函数:

Object result = invocableEngine.invokeFunction(functionName, parameters);
Run Code Online (Sandbox Code Playgroud)

现在,在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] } ]
}
Run Code Online (Sandbox Code Playgroud)

然而,在Java方面,"result"是类型的对象 sun.org.mozilla.javascript.internal.NativeObject

有没有办法让我将它转换为合理的Java数据结构,而没有将JSON序列化为字符串然后使用Gson解析它的开销?

假设目前数据结构被合理地定义,例如,我知道对象是具有键"key1"和"key2"的散列,第一个映射到具有键"key1_1"和"key1_2"的散列; 第二个映射到散列数组,每个散列都有标量键"key2_1"和"key2_2"以及数组"key2_3".

我的两个优先事项是:

  1. 性能(这是我对序列化+ Gson-parse持谨慎态度的一个原因)
  2. Java 6,7和8之间的可移植性(但是,我更喜欢实质上更快的非便携式解决方案).

Boh*_*ian 0

您可以通过将任何 json 字符串“对象”解析Gson为 来解析它LinkedTreeMap,如下所示:

import com.google.gson.internal.LinkedTreeMap;

String json = <your raw json>
LinkedTreeMap map = new Gson().fromJson(json, LinkedTreeMap.class);
Run Code Online (Sandbox Code Playgroud)

解析示例输入后,以下是如何使用它的示例:

System.out.println(((List<LinkedTreeMap>)map.get("key2")).get(1).get("key2_3"));
Run Code Online (Sandbox Code Playgroud)

输出:

[1.0, 2.0, 3.0]
Run Code Online (Sandbox Code Playgroud)

事先了解结构会有所帮助,但这并不是必需的,因为您可以在获得每个节点时检查它的类型。

至于性能,我创建了带有 4 个键的示例输入,每个键的列表中有超过 400 个条目。JVM 警告后,在我的低规格旧笔记本电脑上,解析只花了 2 毫秒。