下面的代码产生以下编译器警告:
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>
答案 0 :(得分: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());
}
}
答案 1 :(得分:1)
由于object item
在内部使用原始类型集合,因此您将收到此警告。
公共类JSONObject扩展了HashMap ...
如果要消除此警告,可以在代码中添加以下注释。
org.json.simple.JSONObject
甚至更好的是,您可以尝试使用支持泛型的库...
答案 2 :(得分:0)
您可以通过将该警告显式转换为所需的类型来消除该警告
let builder = require('xmlbuilder', { encoding: 'utf-8' });
let name = "ABC";
let xml = builder.create('Slides');
xml.ele('props',"Hello");
xml.ele('name')
.ele("Hello", name);
xml.end({ pretty: true });
console.log(xml.toString())
但是您有时会遇到另一个警告。
<Slides>
<props>Hello</props>
<name>
<Hello>ABC</Hello>
</name>
</Slides>
这是因为类JSONObject从HashMap扩展而来,但没有指定与Hashmap相同的泛型。
答案 3 :(得分:0)
尽管我不会将其称为最佳解决方案,但是如果您真的想在没有任何警告的情况下使用相同的库,则可以使用
Map<String,String> jsonMap = new HashMap<>();
jsonMap.put("foo", "bar");
JSONObject obj = new JSONObject(jsonMap);
这将在没有任何警告的情况下起作用,并且可以满足您的需求。