【问题标题】:Retrieving json from stringified javascript function returned in http response从 http 响应中返回的字符串化 javascript 函数中检索 json
【发布时间】:2013-08-25 20:33:09
【问题描述】:

我有 java (JDK6) 代码,可以发送带有参数的 http get 请求。我得到的响应是一个 javascript 函数,其中包含一个 json 树,其中包含对请求中提供的查询参数的响应,如下所示:

function JavascriptFunction() { return { "Root" : [ { ... ] }; }

我正在尝试使用 java 中的 ScriptEngine api 绑定并执行返回的函数以检索 JSON 节点。

String response = EntityUtils.toString(httpResponse.getEntity());
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByExtension("js");
scriptEngine.eval(response);

String hopeThisIsJson = (String)((Invocable)scriptEngine).invokeFunction("JavascriptFunction");

我收到 ClassCastException,因为返回的“事物”是 sun.org.mozilla.javascript.internal.NativeObject 类型。
我试图弄清楚如何最终将从invokeFunction方法返回的这个对象转换为最初从“JavascriptFunction”方法返回的json树。

【问题讨论】:

  • 你在这里检查了响应的值吗:String response = EntityUtils.toString(httpResponse.getEntity());
  • 我确实检查了值。这是字符串化的 Javascript 函数。

标签: java javascript json rhino javascript-engine


【解决方案1】:

您的 JavaScript 函数正在返回一个非 JSON 编码的对象。你可以试试这个:

String json = (String) scriptEngine.eval("JSON.stringify(JavascriptFunction());");

在 JavaScript 代码中没有“JSON 树”这样的东西。那是一个 JavaScript 对象字面量表达式,也就是说它只是一个普通的 JavaScript 对象。

【讨论】:

  • 我尝试了你的建议。我得到 javax.script.ScriptException... ReferenceError: "JSON" is not defined。我拥有的 Rhino 引擎可能不支持存在“JSON”的 Javascript 版本。在这种情况下,我必须假设我无法更改版本。使用它的任何替代方法?
  • @user2714310 是的,您至少需要 1.7 版本的 Rhino。如果您无法更改版本,则必须使用 JSON 工具包,例如 json.org 提供的工具包。
  • 感谢您的信息。我会调查的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
相关资源
最近更新 更多