【问题标题】:JSONObject unchecked call to put(K,V) as a member of the raw type java.util.HashMapJSONObject 未经检查地调用 put(K,V) 作为原始类型 java.util.HashMap 的成员
【发布时间】:2019-04-13 00:47:57
【问题描述】:

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

JSONObject obj = new JSONObject();
obj.put("foo", "bar");

编译器消息:

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

我通过 JSONObject.put() 用值填充 JSONObject,然后调用 obj.toString() 以获取 json。如何修复上面的警告(我使用 -Werror 编译)。

JSONObject 来自以下库。

import org.json.simple.JSONObject;

Maven 依赖:

<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1.1</version>
</dependency>

【问题讨论】:

  • JSONObject 来自什么库?
  • @DarrenForsythe 已更新 - 见上文

标签: java json


【解决方案1】:

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>

用法:

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());
    }
}

【讨论】:

    【解决方案2】:

    虽然我不会把它称为最好的解决方案,但如果你真的想在没有任何警告的情况下使用同一个库,那么你可以使用

    Map<String,String> jsonMap = new HashMap<>();
    jsonMap.put("foo", "bar");
    JSONObject obj = new JSONObject(jsonMap);
    

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

    【讨论】:

    • 我不必这样做 JSONObject obj = new JSONObject(jsonMap); 但你的提示帮助了我:)
    【解决方案3】:

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

    公共类 JSONObject 扩展 HashMap ...

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

    @SuppressWarnings("unchecked")
    

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

    【讨论】:

      【解决方案4】:

      您可以通过将其显式转换为所需类型来消除该警告

       ((Map<String, String>)obj).put("foo", "bar")
      

      但您有时会遇到另一个警告。

      Type safety: Unchecked cast from JSONObject to Map<String,String>
      

      这是因为 JSONObject 类从 HashMap 扩展而来,但没有指定与 Hashmap 相同的泛型。

      【讨论】:

        猜你喜欢
        • 2014-09-24
        • 2011-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-22
        • 2021-04-17
        • 1970-01-01
        • 2015-08-29
        相关资源
        最近更新 更多