是否可以仅使用JDK或HttpComponents处理JSON响应?

时间:2010-10-19 15:50:54

标签: json java facebook-graph-api httpurlconnection

我们正在升级我们的网络应用程序以使用Facebook的Graph API,它返回JSON响应。但是,我们不希望将依赖性添加到JSON库,除非我们没有其他选择。对于服务器端的http请求,我们使用Apache HttpComponents。

因此,我的问题是我可以用来处理JSON响应的JDK和/或HttpComponents中的类(如果有的话)是什么?欢迎使用代码片段:)

4 个答案:

答案 0 :(得分:3)

是没有是@McDowell提到的javax.script API,但JSON syntax非常简单。您可以自己编写一个基于堆栈的解析器,它确定JSON字符串char-by-char并将JSON数组[]转换为Object[]List<Object>和JSON对象{}转换为{ {1}}。这是一个很好的学习练习。但是,当您不想担心长期稳健性和维护时,我建议您只选择this page底部列出的一个Java库。我个人最喜欢的是Google Gson。它可以nicely将复杂的JSON结构转换为完全可重用的Javabeans。

答案 1 :(得分:3)

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

但是,您需要信任数据,否则您会对代码注入攻击开放。对我来说,这不适合替代正确的JSON解析器。

答案 2 :(得分:3)

不幸的是,原生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

答案 3 :(得分:2)

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

作为示例,为了使用json,您可以使用tokener并将原始字符串转换为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

获取