13

我有一些数据存储在 Java 元素中,我需要以给定的格式返回它 - JSONObject。虽然我的实现工作正常,但我仍然收到来自 eclipse 的警告消息(版本:Juno Service Release 2):

类型安全:方法 put(Object, Object) 属于原始类型 HashMap。对泛型类型 HashMap 的引用应参数化

这是我的代码:

public interface Element {...}

public abstract class AbstractElement implements Element {...}

public final class Way extends AbstractElement {...}

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class WayToJsonConverter{
    ...
    public JSONObject wayToJson(){
        JSONObject obj = new JSONObject();
        obj.put("id",way.getId());
        ...
        return obj;
    }
    ...
}

有问题的行是:obj.put("id",way.getId());

除了添加之外,有没有办法解决这个问题@SuppressWarnings("unchecked")

4

7 回答 7

15

你的 JSONObject 是什么,它是从 HashMap 继承的吗?如果是这样,警告可能意味着您应该如下声明 JSONObject 实例:

JSONObject<String,Object> obj=new JSONObject<String,Object>();

更新:查看 JSONObject 的定义:

public class JSONObject extends HashMap

它扩展了 HashMap 但不支持参数类型,如果它的定义是

public class JSONObject<K,V> extends HashMap<K,V>

然后我们可以写

JSONObject<String,Object> obj=new JSONObject<String,Object>();

并且 put 方法将不再产生警告

于 2013-05-07T09:24:40.970 回答
2

如果您不能切换到另一个库或修改该库的代码以使其通用,则唯一的其他选择是围绕该库编写一个使用它的包装器,并正确支持泛型。

因此,您将拥有自己的JSONObject类,该类将包含一个org.json.simple.JSONObject、扩展HashMap<String, Object>和实现Map<String, Object>,并将包含所有方法的转发方法org.json.simple.JSONObject

您仍然必须放入@SuppressWarnings("unchecked")此类,但它仅限于此类,并且您的所有其余代码都可以没有通用警告或抑制它们。

于 2013-05-07T18:24:45.910 回答
1

公共类 JSONObject 扩展 HashMap 实现 Map、JSONAware、JSONStreamAware

但在类定义中没有类型参数,您唯一的选择是添加 @SuppressWarnings("unchecked")

于 2018-05-02T14:46:02.463 回答
0

仅供参考org.codehaus.jettison.json.JSONObject不会导致此警告。使用 codehaus 的 JSONObject 时,您还可以通过org.codehaus.jettison.json.JSONException. 有关详细信息,请参阅https://github.com/codehaus/jettison

于 2014-07-24T16:52:04.790 回答
0

您可以创建一个地图对象,然后对 JSONObject 进行显式转换

Map<String, String> obj =  new HashMap<String, String>();
obj.put("id",way.getId());
JSONObject jsonObj =  (JSONObject) obj;

但请注意,这将限制您在 JSON 中仅包含“字符串”。如果您放置另一个数据结构,您将看到编译错误。说一个数组。

于 2016-03-02T18:04:53.007 回答
0

另一种选择是JSONObject使用 (parameterized)初始化Map<String, Object>。这样,值可以是任何有效的 JSON 类型,并且您可以避免unchecked警告。例如:

public class WayToJsonConverter{
    ...
    public JSONObject wayToJson(){
        Map<String, Object> forJsonObj = new HashMap<>();
        forJsonObj.put("id",way.getId());  // No warning, hurray!
        forJsonObj.put("integer", 14);
        forJsonObj.put("floating", 1.4);
        JSONObject obj = new JSONObject(forJsonObj);
        ...
        return obj;
    }
    ...
}
于 2017-08-30T05:49:15.553 回答
0

尝试将put行更改为 other

 JsonPath.parse(jsonObj).set(fieldPath, Value);
于 2020-10-26T09:44:40.947 回答