这是我的第一篇文章。作为一名初露头角的Android开发人员,我每天都会在各种主题上阅读SO帖子,但对于这个问题,我没有找到Google或SO的任何帮助。
到目前为止我的研究:
搜索此问题比正常情况更难,因为搜索引擎似乎并不关心区分大小写,这在此问题中至关重要。搜索Google只会给我链接到课程本身,旧文章或完全不相关的文章。我得到的最接近的是JSONArray和JSONObject,这是一个完全不同的问题。 SO搜索给出了相同的结果。据我所知,SO上的所有相关帖子都引用JSONObject而不是JsonObject。
Oracle和json.org文档都没有提到另一方,Android开发人员JSONObject页面也没有提到使用org.json库。
http://docs.oracle.com/javaee/7/api/javax/json/JsonObject.html
http://www.json.org/javadoc/org/json/JSONObject.html
我还会发布一个指向JSONObject的Android参考页面的链接,但我作为新手的代表太低了。
问题的历史: 我正在从Oracle页面阅读有关Json编码和解码的内容,我尝试复制并粘贴到我的AndriodStudio IDE中,这会立即产生错误,因为它没有像通常那样建议导入语句。我已经了解到这意味着该类不是内置库的一部分。
问题是我粘贴的代码使用的是JsonObject(来自javax.json库)而不是JSONObject(来自org.json库)。当我注意到Android页面和Oracle页面之间存在差异时,我将代码从Json更改为JSON,并且我的IDE立即提供了org.json import语句。
问题(S): 当外部库是什么时,为什么Oracle使类不属于默认库? JSON是旧的,不赞成使用的方式,Json是新的,正确的方式吗? 它们功能相同吗?如果没有,请提供示例? 有些情况对一方更好,有些情况对另一方更好吗? 最终,我应该使用哪些,以及为什么(如果尚未涵盖)? 如果,javax.json,下载该库的最佳(最安全)位置在哪里?
答案 0 :(得分:15)
有点晚了,但我想就此分享我的意见。
我最近遇到了这个问题,当我找到一个带有两个库的Java项目时,它们同时被使用。
我认为org.json
更容易阅读和使用,主要有两个原因(根据我的需要):
JsonObject是不可变的。您不能将新的键/值对添加到现有的JsonObject(参考此处:javax.json: Add new JsonNumber to existing JsonObject)
相当于打印JsonObject或JsonArray需要几行,而使用JSONObject或JSONArray只需要1行。例如:
StringWriter sw = new StringWriter();
Map<String, Object> properties = new HashMap<>();
properties.put(JsonGenerator.PRETTY_PRINTING, true);
JsonWriterFactory writerFactory = Json.createWriterFactory(properties);
JsonWriter jsonWriter = writerFactory.createWriter(sw);
jsonWriter.writeObject(jsonObject); //JsonObject created before
jsonWriter.close();
String prettyPrintedJSON = sw.toString();
这是我用来获取写入文件的缩进JSON的代码。使用org.json我只需要jsonObject.toString(4)
。
另一个区别是构造函数。您需要JsonObjectBuilder
来创建一个javax.json
的JSON。更进一步,可以避免。
我确定会有更多的差异(不确定是否可以从字符串中创建JsonObject
)但这些是我的想法。
答案 1 :(得分:2)
JSONObject由android的API提供。 JsonObject专门用于Java EE开发,该开发本质上用于Web应用程序和网络功能。
Android之所以没有从Oracle Java EE软件包中预打包JsonObject的原因是因为android中不允许javax可以做的很多事情,就像未经许可访问Internet一样。这意味着导入Javax的整个jar文件将与Android冲突。
如果您打算使用Java EE构建自己的后端,我强烈建议在JSONObject上使用JsonObject。另一方面,如果您知道预建的REST服务或类似的东西甚至更好地支持Android的JSON。
答案 2 :(得分:0)
我建议您使用Google的json-simple工具包以使用JSON对象。它提供了有用的功能,并且不依赖于外部库,这在Android应用程序的开发过程中成为一个巨大的问题。
回答你的问题:如果你不想在你的项目中使用json-simple,你应该使用org.json中的JSONObject,因为它是由Android JDK提供的。有关详细信息,请参阅http://developer.android.com/reference/org/json/JSONObject.html。
答案 3 :(得分:-2)
org.json
不包含用于解析JSON字符串的解析类。而org.json.simple
包含一个解析类。
org.json.JSONObject
包含许多getter方法,可直接获取int,boolean,object,string,JSON Array等。org.json.simple.JSONObject
不包含特定方法,因此您需要输入强制类型每次获得特定钥匙的价值时。
简单来说,使用org.json.simple.JSONObject
单独解析并输入org.json.JSONObject
以便在程序中进一步使用。