org.apache.sling.commons.json.JSONArray在AEM 6.3中已弃用

时间:2017-06-27 11:17:35

标签: cq5 aem

在AEM 6.3中,不推荐使用JSONArray API,那么替代JSONArray API的替代方法是什么?

4 个答案:

答案 0 :(得分:6)

由于许可证问题,这些类已被Sling 9删除。它只是json.org库。 Sling本身只将它用于一些东西,所以Sling被重构为没有它而相处。

我害怕,没有替代品。您必须选择不同的JSON库,将其包含在项目中并移植代码。由于JSON lib非常简单,所以它应该是可行的。

这里有一些与邮件列表的链接:

https://lists.apache.org/thread.html/ee51bace078681765d5dcfeda1939628ccefb9b4261b1d7f6a56d420@%3Cdev.sling.apache.org%3E

http://mail-archives.apache.org/mod_mbox/www-legal-discuss/201611.mbox/browser

https://issues.apache.org/jira/browse/SLING-6536

这是有问题的许可证。它包含含糊不清的句子" 软件应用于善,而不是邪恶。"

https://github.com/stleary/JSON-java/blob/master/LICENSE

答案 1 :(得分:4)

最好的方法是将您的Json API从org.apache.sling.commons.json更改为com.google.gson。因为它已经在AEM的其他地方使用过。

GSON Usage in AEM

答案 2 :(得分:0)

另一种避免(最多)代码更改的方法是用Org.Json 替换Sling Commons JSON库,如果您可以忍受最初导致不推荐使用的许可证更改

添加到pom.xml依赖项:

您可以将org.json依赖项添加到pom.xml:

<dependency>
 <groupId>org.json</groupId>
 <artifactId>json</artifactId>
 <version>20180813</version>
</dependency>

<!-- Or depending on version of AEM 
     use the granite bundled version instead -->

<dependency>
    <artifactId>json</artifactId>
    <version>20090211_1</version>
    <groupId>com.adobe.granite.bundles</groupId>
    <scope>provided</scope>
</dependency>

或使用Open-JSON,这是Android团队在无尘室中重新实现的,它具有标准的Apache 2.0许可证,但没有'evil'子句:

<dependency>
    <groupId>com.tdunning</groupId>
    <artifactId>json</artifactId>
    <version>1.8</version>
</dependency>

更新导入语句

Apache Sling Commons JSON主要是重新打包的org.json解析器,除了程序包路径差异外,似乎是兼容的。要更改为org.json或Open-Json解析器,请更改以下导入:

import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.apache.sling.commons.json.io.JSONWriter;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONWriter;

对于许多人来说,这将是一个可以接受且干净的解决方案,不需要重新编写所有代码即可使用GSON或Jackson(两者均在AEM中提供)。

注意:我只测试过此编译器...您可能需要将解析器嵌入到包中。这些解析器都没有声称知道OSGi。

答案 3 :(得分:0)

您可以根据需要使用任何json API。我建议使用Gson,因为它很容易使用,因为可以将json对象直接映射到pojo类,然后使用pojo类的对象。它删除了许多用于逐一读取json对象的样板代码。