gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:31 26 4
gpt4 key购买 nike

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

我成功地从 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-parse 持谨慎态度的原因之一)
  2. Java 6、7 和 8 之间的可移植性(但是,我更喜欢实质上更快的非可移植解决方案)。

最佳答案

这是从 NativeObject 到 JSONObject 的代码。我认为从 NativeObject 到 Map 是类似的。

    public static JSONObject toJsonObject(NativeObject nativeObject)
{
JSONObject object = new JSONObject();
Set<Entry<Object, Object>> entrySet = nativeObject.entrySet();
for (Entry<Object, Object> entry : entrySet)
{
try
{
if (entry.getValue() instanceof String)
{
object.put(entry.getKey().toString(), new JSONObject(entry.getValue().toString()));
}
else if (entry.getValue() instanceof NativeArray)
{
object.put(entry.getKey().toString(), toJsonArray((NativeArray) entry.getValue()));
}
else if (entry.getValue() instanceof NativeObject)
{
object.put(entry.getKey().toString(), toJsonObject((NativeObject) entry.getValue()));
}
}
catch (JSONException e)
{
try
{
object.put(entry.getKey().toString(), entry.getValue().toString());
}
catch (JSONException ignored)
{
}
}
}


return object;
}

public static JSONArray toJsonArray(NativeArray nativeArray)
{
JSONArray array = new JSONArray();

for (Object o : nativeArray)
{
if (o instanceof NativeObject)
{
array.put(toJsonObject((NativeObject) o));
}
else if (o instanceof NativeArray)
{
array.put(toJsonArray((NativeArray) o));
}
else
{
try
{
array.put(new JSONObject(o.toString()));
}
catch (JSONException e)
{
array.put(o.toString());
}
}
}

return array;
}

关于java - 如何将 Rhino 生成的 JSON 数据结构 (NativeObject) 转换为 Java 数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29136142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com