在使用Jackson反序列化递归Map <string,object>后避免类型安全警告

时间:2015-07-24 10:40:14

标签: java jackson

我从REST API获取一个递归字典,我使用Jackson使用以下代码在Java中导入为Map<String,Object>

  private static final ObjectMapper OBJECTMAPPER = new ObjectMapper();
    private static  final MapType GENERICMAPTYPE = OBJECTMAPPER.getTypeFactory().constructMapType(
            Map.class, String.class, Object.class);
...

  Map<String, Object> response =  OBJECTMAPPER.readValue(result.getBody(),GENERICMAPTYPE);

然后我尝试在树中找到一些属性,代码如

   if (response.get("infos") instanceof Map<?,?>)
            Map<String, Object> infos = (Map<String, Object>) response.get("infos");

我在地图上获得了类型安全警告。完全可以理解。 有没有比在这里添加@SuppressWarnings("unchecked")更好的方法来告诉编译器一切正常?

2 个答案:

答案 0 :(得分:1)

在您的情况下,responseMap<String, Object>。 您正在呼叫response.get("infos")。从提供的泛型返回Object,必须将其转换为Map,这就是您收到警告的原因。

您可以做的是不使用Map<String, Object>,而是定义表示响应JSON结构的类。

这样的东西
public class Response {

    private Infos infos;

}

public class Infos {

     private int foo;
     private String bar;
}

然后,您可以使用Jackson将响应解析为此类结构,并通过getter / setter访问所有属性,确保您的代码是类型安全的。

答案 1 :(得分:0)

根据fge的评论,杰克逊JsonNode类型是正确的方法。

JsonNode responseAsTree = OBJECTMAPPER.readTree(responseAsString);

JsonNode具有以简单方式遍历树所需的所有方法。见Faster XML Tutorial