哪一个使用?来自org.json的JSONObject来自javax.json的VS JsonObject

时间:2015-03-13 21:54:37

标签: java android json

这是我的第一篇文章。作为一名初露头角的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,下载该库的最佳(最安全)位置在哪里?

4 个答案:

答案 0 :(得分:15)

有点晚了,但我想就此分享我的意见。

我最近遇到了这个问题,当我找到一个带有两个库的Java项目时,它们同时被使用。

我认为org.json更容易阅读和使用,主要有两个原因(根据我的需要):

  1. JsonObject是不可变的。您不能将新的键/值对添加到现有的JsonObject(参考此处:javax.json: Add new JsonNumber to existing JsonObject

  2. 相当于打印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();
    
  3. 这是我用来获取写入文件的缩进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)

  1. org.json不包含用于解析JSON字符串的解析类。而org.json.simple包含一个解析类。

  2. org.json.JSONObject包含许多getter方法,可直接获取int,boolean,object,string,JSON Array等。org.json.simple.JSONObject不包含特定方法,因此您需要输入强制类型每次获得特定钥匙的价值时。

  3. 简单来说,使用org.json.simple.JSONObject单独解析并输入org.json.JSONObject以便在程序中进一步使用。