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

vai*_*hav 5 java generics parameterized compiler-warnings json-simple

我刚刚遇到需要将数据放入JSONObject的情况,而这样做我收到了编译器的警告.

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

我试图参数化JSONObject但它给了我错误.

我正在使用以下代码,其中option是Object.

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

这是怎么造成的,我该如何解决?

小智 10

我不知道您是否仍然存在此问题,但我认为它将使遇到此问题的其他人受益。

我遇到了这个问题,过了一会儿,我设法使用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);
Run Code Online (Sandbox Code Playgroud)

如果您不知道哈希图将保留哪种类型,或者如果它包含多种类型,则使用Object更为安全。否则请使用正确的类型。

此解决方案适用于JSON简单1.1.1和Java 1.5及更高版本。

  • 当我尝试创建一个在构造函数中传递 HashMap 的 JSONObject 时,我得到以下信息 - 构造函数 JSONObject(HashMap&lt;String,Object&gt;) 未定义。 (3认同)
  • 我认为这应该是公认的答案!谢谢! (2认同)

wer*_*ero 7

您正在使用JSON Simple.它JSONObject源自HashMap但不幸的是不使用泛型参数(可能是因为它是在预通用时间创建的).因此,您看到的警告与以下内容相同:

HashMap map = new HashMap();
map.put("showOppo", option.isShowOppo());
Run Code Online (Sandbox Code Playgroud)

不幸的是你无法避免警告.

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

  • [下面的答案](/sf/ask/2481717731/#answer-40087076)展示了您如何**可以** 避免警告。 (2认同)