【问题标题】:Which one to use? JSONObject from org.json VS JsonObject from javax.json使用哪一个? org.json 中的 JSONObject VS javax.json 中的 JsonObject
【发布时间】:2015-05-16 13:09:40
【问题描述】:

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

到目前为止我的研究:
搜索这个问题比平常更难,因为搜索引擎似乎并不关心区分大小写,这在这个问题中至关重要。搜索谷歌只给我链接到课程本身、旧文章或完全不相关的文章。我得到的最接近的是 JSONArray vs JSONObject,这是一个完全不同的问题。所以搜索给出了相同的结果。据我所知,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 导入语句。

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

【问题讨论】:

  • 默认库 您用于在 Android 上开发的 JDK 由 Android 提供,而不是 Oracle。 javax.json 也是 Java EE 的一部分,而不是 Java SE。
  • 当我从纯 Java 迁移到 Android 时,我没有下载额外的 jdk。 AndroidStudio 应用程序中是否包含备用 JDK?

标签: java android json


【解决方案1】:

我建议您使用 Google 的 json-simple 工具包来处理 JSON 对象。它提供了有用的功能并且不依赖外部库,这在Android应用程序开发过程中被证明是一个巨大的问题。

回答您的问题:如果您不想在项目中使用 json-simple,您应该使用 org.json 中的 JSONObject,因为它是由 Android JDK 提供的。如需更多信息,请参阅http://developer.android.com/reference/org/json/JSONObject.html

【讨论】:

  • 我不是不同意,只是对这个话题不熟悉。您所说的“Android 应用程序开发过程中的一个巨大问题”到底是什么意思? (来源赞赏)。还有,为什么 developer.android.com 使用 org.json 会导致 Android 开发出现问题?
  • 最近我发现旧Android版本中的一些包不能正常工作,必须下载并作为jar(“shadowed”)实现。我不太确定 org.json 是如何受到这个问题的影响的,但是我很难用 Gradle 来隐藏依赖关系。在我的示例中,“org.apache.http.conn.ssl”和 bouncycastle 没有按预期工作。
  • 2019 年更新:请注意 json simple 已死,不再维护。
【解决方案2】:

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

我最近发现一个包含两个库并且同时使用它们的 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();
    

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

另一个区别是构造函数。您将需要 JsonObjectBuilder 来创建带有 javax.json 的 JSON。可以避免的多一步。

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

【讨论】:

  • 需要注意的是,javax.json 充分利用了现有的接口,而 org.json 则完全没有接口,例如JSONArray 不能在 foreach 块中使用。 org.json 可能会变得更实用,但不使用现有接口可能会被视为设计缺陷。
  • org.codehaus.jettison.json.JSONArray 怎么样?这与这里提到的两个选项有什么关系?
  • @dokaspar 我没有使用那个库,所以不能说
【解决方案3】:
  1. org.json 不包含用于解析 JSON 字符串的解析类。而org.json.simple 包含一个解析类。

  2. org.json.JSONObject包含很多getter方法,可以直接获取为int、boolean、object、string、JSON Array等。org.json.simple.JSONObject不包含具体方法,所以每次获取时都需要type cast特定键的值。

  3. 简而言之,使用org.json.simple.JSONObject 单独解析并将其类型转换为org.json.JSONObject 以便在程序中进一步使用。

【讨论】:

  • org.json 可以通过将 JSON 字符串传递给 JSONObject 构造函数来解析它。听起来您建议同时使用这两个库,这肯定会导致混乱。选择一个并使用它。
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多