JSON-Simple导致编译器警告“类型安全:put(Object,Object)方法属于原始类型HashMap。”

17

我最近遇到了这样的情况,需要将数据放入JSONObject中,但在执行该操作时,编译器报出了一个警告。

类型安全:方法put(Object,Object)属于原始类型HashMap。对泛型类型HashMap的引用应该进行参数化。

我尝试对JSONObject进行参数化,但是遇到了错误。

我正在使用以下代码,其中option是一个对象。

JSONObject additionalDetails = new JSONObject();
additionalDetails.put("showOppo", option.isShowOppo());
additionalDetails.put("showCont", option.isShowCont());
additionalDetails.put("contActionTaken", option.isConActionTaken());
additionalDetails.put("oppoActionTaken", option.isOppoActionTaken());

这是什么原因,我该如何解决?

6个回答

36

我不知道你是否仍然遇到这个问题,但我认为分享这个解决方法会对其他遇到同样问题的人有所帮助。

我之前也遇到了这个问题,后来通过使用 HashMap 终于将其修复了。

HashMap<String,Object> additionalDetails = new HashMap<String,Object>();
additionalDetails.put("showOppo", option.isShowOppo());
additionalDetails.put("showCont", option.isShowCont());
additionalDetails.put("contActionTaken", option.isConActionTaken());
additionalDetails.put("oppoActionTaken", option.isOppoActionTaken());

JSONObject additionalDetailsJSON = new JSONObject(additionalDetails);

如果您不知道HashMap将会保存哪种类型的数据,或者它将保存多种类型的数据,最安全的做法是使用Object。否则,请使用正确的类型。

此解决方案适用于json-simple 1.1.1和Java 1.5及更高版本。


3
当我尝试在构造函数中传递HashMap来创建JSONObject时,出现以下错误 - 构造函数JSONObject(HashMap<String, Object>)未定义。 - skoriy
2
在我看来,这应该是被接受的答案!谢谢! - Chagai Friedlander
是的,这应该是被接受的答案,运行得很好,这似乎是正确的做法。 - Anurag
JSONObject似乎没有接受对象的构造函数,只有一个普通的无参构造函数。 - Keith Tyler
@KeithTyler 请确保版本至少匹配(json-simple 1.1.1 和 Java 1.5 及以上)。我没有在其他版本的 json-simple 上进行测试,只有 v1.1.1。 - Ashwin

14

您正在使用JSON Simple。其JSONObject源自HashMap,但不幸的是没有使用泛型参数(可能是因为它是在泛型时代之前创建的)。因此,您看到的警告与以下相同:

HashMap map = new HashMap();
map.put("showOppo", option.isShowOppo());

很遗憾,您无法避免这些警告。

我建议切换到另一个 JSON 库,如 GSON 或 Jackson。


2
下面的答案展示了如何避免编译器警告,具体请参考:https://dev59.com/_VsW5IYBdhLWcg3wDzku。 - Chagai Friedlander

1
最近我遇到了一个问题。有两个用于JSONObject的库让您感到困惑,您使用了错误的json jar即json-simple-1.1.jar,您导入的包是org.json.simple.JSONObject,请使用java-json.jar并导入org.json.JSONObject,从http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm下载jar文件。

我开始觉得人们应该远离jsonsimple。一个大问题是糟糕的包命名与实际的json.org Java实现冲突。这使得同时使用两个库变得不可能/令人望而生畏。但它并不健壮或干净。 - Keith Tyler

1
为了避免警告并更好地工作,我将其改为以下形式(当 JSONObject additionalDetails
import com.jayway.jsonpath.JsonPath;

 JsonPath.parse(additionalDetails).set(fieldPath, Value);

0
如果 option.isShowOppo() 返回布尔值,请尝试使用 Boolean value= option.isShowOppo();,然后将 additionalDetails.put("showOppo",value); 添加到其中。

0
使用这个json实现代替 - 它完全解决了问题! 注意:使用toString()方法而不是toJSONString()方法。
import org.json.JSONObject;

<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20231013</version>
</dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接