下面的代码产生以下编译器警告:
JSONObject obj = new JSONObject();
obj.put("foo", "bar");
Run Code Online (Sandbox Code Playgroud)
编译器消息:
未经检查的调用 put(K,V) 作为原始类型 java.util.HashMap 的成员
我通过 JSONObject.put() 用值填充 JSONObject,然后调用 obj.toString() 来获取 json。如何修复上面的警告(我用 -Werror 编译)。
JSONObject 来自以下库。
import org.json.simple.JSONObject;
Run Code Online (Sandbox Code Playgroud)
Maven 依赖:
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
json-simple 库是用旧的字节码版本编译的:46.0。这是 Java 1.2。JSONObject 映射扩展了 java.util.HashMap 并且您直接使用了 java.util.HashMap 的“put”方法
Java 5 中添加了泛型。从 Java 5 开始,编译器鼓励使用泛型类型。这样,编译器建议您应该升级代码以提高类型安全性。
在这种情况下,不安全的使用来自库,您无法控制它。我建议要么搜索较新版本的库,要么切换到另一个库。
更新:您可以尝试以下库作为替代:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180813</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
用法:
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.Arrays;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
JSONObject obj = new JSONObject();
obj.put("hello", "world");
obj.put("collection", new JSONArray(Arrays.asList(1, "two", Collections.singletonMap("three", 30))));
System.out.println("obj.toString() = " + obj.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
您收到此警告是因为org.json.simple.JSONObject在内部使用原始类型集合。
公共类 JSONObject 扩展 HashMap ...
如果您想摆脱此警告,可以将以下注释添加到您的代码中。
@SuppressWarnings("unchecked")
Run Code Online (Sandbox Code Playgroud)
或者更好的是,您可以尝试使用支持泛型的库......
虽然我不会称其为最佳解决方案,但如果您真的想在没有任何警告的情况下使用相同的库,那么您可以使用
Map<String,String> jsonMap = new HashMap<>();
jsonMap.put("foo", "bar");
JSONObject obj = new JSONObject(jsonMap);
Run Code Online (Sandbox Code Playgroud)
这将在没有任何警告的情况下工作,并且可以满足您的需求。