【问题标题】:is it possible to proccess JSON responses with the JDK or HttpComponents only?是否可以仅使用 JDK 或 HttpComponents 处理 JSON 响应?
【发布时间】:2011-04-27 13:53:22
【问题描述】:

我们正在升级我们的网络应用程序以使用 Facebook 的 Graph API,它会返回 JSON 响应。但是,除非我们别无选择,否则我们不想向 JSON 库添加依赖项。对于服务器端的 http 请求,我们使用 Apache HttpComponents。

因此,我的问题是我可以用来处理 JSON 响应的 JDK 和/或 HttpComponents 中的哪些类(如果有)?欢迎使用代码 sn-ps :)

【问题讨论】:

  • “额外库”厌恶背后的原因究竟是什么?核心问题可能必须在其他地方解决。

标签: json java facebook-graph-api httpurlconnection


【解决方案1】:

不幸的是,原生 JSON 支持 was delayed past Java 9

但为了体育精神,这里是使用 Nashorn JavaScript 引擎的普通 Java 8 hacky 解决方案,没有任何外部依赖:

String json = "{\"foo\":1, \"bar\":\"baz\"}";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
Object o = engine.eval(String.format("JSON.parse('%s')", json));
Map<String, String> map = (Map<String, String>) o;
System.out.println(Arrays.toString(map.entrySet().toArray()));
// [foo=1, bar=baz]

Since Java 8u60 JSON.parse 可以替换为 Java.asJSONCompatible,这样可以更好地处理 JSON 数组。

学分:

Effective way to pass JSON between java and javascript

https://dzone.com/articles/mapping-complex-json-structures-with-jdk8-nashorn

【讨论】:

  • 这太棒了!我的用例是一个 json,类似于 "{\"message\" : \"{0}\"}",我从用户那里得到了实际的消息。我可以以某种方式使用 nashorn 将字符串变成正确的 json 文字吗?
  • 这里使用“JSON.parse”和Java.asJSONCompatible有什么区别 - adam-bien.com/roller/abien/entry/converting_json_to_map_with
  • @Jay, Java.asJSONCompatible 执行 JSON 数组到 Java 列表的映射。我已经更新了答案。感谢您的提示。
  • 这为我解决了这个问题,谢谢。对于另一个方向 - 生成要发送的有效 json 字符串,我发现它可以工作 - stackoverflow.com/questions/56013134/…
【解决方案2】:

我认为您正在寻找的是 org.json 包。您可以获取源代码here 并简单地将少量文件包含在您的项目中,它没有任何依赖关系。这将允许您创建和解析 JSON。 javadocs 做得很好,可以在here 找到。

例如,对于消费 json,您可以使用标记器并将原始字符串转换为 JSONObject。然后您可以通过索引或键访问数组。您可以通过将嵌套数组获取为 JSONObject 或 JSONArray 来访问它们。

JSONTokener tokener = new JSONTokener(myJsonString);
JSONObject json = new JSONObject(tokener);

String error = json.get("error");
int errorCode = json.getInt("error_code");

JSONArray messages = json.getJsonArray("messages");

更新: 也可以在GitHub获得源代码

【讨论】:

  • 链接失效了,你认为你可以更新它们吗?谢谢。
【解决方案3】:

这是可能的。因为 JSON 是有效的 JavaScript 语法,您可以通过 scripting API 使用内置的 JavaScript 解释器来创建对象图,然后遍历它(例如,使用访问者模式将数据推送到 Java 对象中)。

但是,您需要信任数据,否则您将面临代码注入攻击。对我来说,这不足以替代适当的 JSON 解析器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多