JSONObject 未经检查调用 put(K,V) 作为原始类型 java.util.HashMap 的成员

s5s*_*s5s 3 java json

下面的代码产生以下编译器警告:

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)

ygo*_*gor 8

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)


Gui*_*rré 5

您收到此警告是因为org.json.simple.JSONObject在内部使用原始类型集合。

公共类 JSONObject 扩展 HashMap ...

如果您想摆脱此警告,可以将以下注释添加到您的代码中。

@SuppressWarnings("unchecked")
Run Code Online (Sandbox Code Playgroud)

或者更好的是,您可以尝试使用支持泛型的库......


har*_*rsh 5

虽然我不会称其为最佳解决方案,但如果您真的想在没有任何警告的情况下使用相同的库,那么您可以使用

Map<String,String> jsonMap = new HashMap<>();
jsonMap.put("foo", "bar");
JSONObject obj = new JSONObject(jsonMap);
Run Code Online (Sandbox Code Playgroud)

这将在没有任何警告的情况下工作,并且可以满足您的需求。