我试图在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".
我的两个优先事项是:
您可以通过将任何 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 毫秒。
| 归档时间: |
|
| 查看次数: |
1236 次 |
| 最近记录: |