簡體   English   中英

JSONObject未經檢查的調用put(K,V)作為原始類型java.util.HashMap的成員

[英]JSONObject unchecked call to put(K,V) as a member of the raw type java.util.HashMap

下面的代碼產生以下編譯器警告:

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>

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

您收到此警告是因為org.json.simple.JSONObject內部使用原始類型集合。

公共類JSONObject擴展了HashMap ...

如果要擺脫此警告,可以在代碼中添加以下注釋。

@SuppressWarnings("unchecked")

甚至更好的是,您可以嘗試使用支持泛型的庫...

您可以通過將其顯式強制轉換為所需的類型來消除該警告

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

但您有時會遇到另一個警告。

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

這是因為JSONObject類是從HashMap擴展而來的,但沒有指定與Hashmap相同的泛型。

盡管我不會將其稱為最佳解決方案,但是如果您確實想在沒有任何警告的情況下使用相同的庫,則可以使用

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

這將在沒有任何警告的情況下工作,並且可以滿足您的需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM