使用哪一个?JSONObject from org.json VS JsonObject from javax.json

2022-08-31 21:05:30

这是我的第一篇文章。作为一名崭露头角的Android开发人员,我几乎每天都在阅读有关各种主题的SO帖子,但对于这个问题,我没有从Google或SO找到任何帮助。

到目前为止,我的研究:
搜索这个问题比平时更难,因为搜索引擎似乎并不关心区分大小写,这在这个问题上至关重要。搜索Google只给了我类本身,旧文章或完全不相关的文章的链接。我得到的最接近的是JSONArray与JSONObject,这是一个完全不同的问题。因此,搜索给出了相同的结果。据我所知,SO上的所有相关帖子都是指JSONObject而不是JsonObject。

Oracle和 json.org 文档都没有提到另一面,使用org.json库的Android开发人员JSONObject页面也没有提到。


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,并立即提供org.json import语句。

问题:为什么Oracle制作的类不是默认库的一部分,而外部库是默认库的一部分?
JSON是旧的,已弃用的方式,而Json是新的,正确的方式吗?
它们在功能上是否相同?如果没有,请提供例子?
有些情况对一个更好,而另一个情况更好吗?
最终,我应该使用哪个,为什么(如果尚未涵盖)?
如果,javax.json,哪里是下载该库的最佳(最安全)位置)?


答案 1

有点晚了,但我想分享我对此的看法。

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

我认为这更容易阅读和使用,原因有2个(为了我的需求):org.json

  1. JsonObject 是不可变的。您无法将新的键/值对添加到已存在的 JsonObject(此处参考:javax.json:向现有 JsonObject 添加新的 JsonNumber)

  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();
    

这就是我用来获取缩进的JSON以写入文件的代码。使用org.json,我只需要.jsonObject.toString(4)

另一个区别是构造函数。您将需要 使用 创建 JSON。可以避免的又一步。JsonObjectBuilderjavax.json

我确信还有更多的差异(不确定是否有可能从字符串创建一个),但这些是我的想法。JsonObject


答案 2

如前所述,JSONObject由Android的API提供。JsonObject专门用于Java EE开发,它本质上是用于Web应用程序和网络功能等。

Android没有从Oracle Java EE包中预先打包JsonObject的原因是,javax可以做的很多事情,在Android中是不允许的,比如未经许可访问互联网。这意味着导入javax的整个jars文件将与Android冲突。

如果你打算用Java EE构建自己的后端,我强烈建议使用JsonObject而不是JSONObject。另一方面,如果您知道预构建的休息服务或类似的东西,则可以更好地支持Android的JSON。