将对象转换为地图:Cast与ObjectMapper

时间:2018-08-28 16:54:09

标签: java serialization casting jackson

以下两种将*(arr+2)转换为Object的方法有什么区别?假设两种方法都可以将Map转换为Object,那么哪种方法更好?

发布:

Map

ObjectMapper:

Object o = some object;
Map<String, Object> map = (Map<String, Object>) o;

2 个答案:

答案 0 :(得分:2)

没有“更好的”。有实际差异。但是首先,这两个选项都使用类型转换,这引发了一个问题:“这两个选项到底怎么被考虑?”

仅当some object通过instanceof Map测试(第一个选项)或o通过instanceof String测试(第二个选项)时,铸造才能工作。

换句话说,答案取决于some object的运行时类。

所以这将因类强制转换异常而失败:

(Map<String, Object>) o;

否则这将因相同的异常而失败:

(String) o 

假定类型检查将通过一种方法,则应考虑以下差异:

  • 如果some objectMap<String, Object>兼容,则应首选强制转换,因为它具有性能优势(可以考虑使用objectMapper.convertValue)。实际上,readValue甚至都不是选项,因为转换为字符串将失败。
  • 如果some object是一个字符串,那么您只能调用readValue,因为您需要解析JSON。

如上所述,还有objectMapper.convertValue,它以智能的方式先检查instanceof,然后再通过JSON解析执行转换。如果两种类型具有相同的字段,则意味着将对象从一种类型转换为另一种类型。

答案 1 :(得分:1)

这取决于输入的内容。

  • (Map<String, Object>) o用于casting转换,因此o的运行时类型必须为Map,否则将抛出ClassCastException:< / p>

    Object o = new HashMap<>();
    Map<String, Object> map = (Map<String, Object>) o; // ok
    
    Object o = new ArrayList<>();
    Map<String, Object> map = (Map<String, Object>) o; //ClassCastException
    
    Object o = new String();
    Map<String, Object> map = (Map<String, Object>) o; //ClassCastException
    
  • ObjectMapper().readValue(String content, JavaType valueType)

      

    从给定的JSON内容字符串反序列化JSON内容的方法。

    ,这意味着输入应为有效json格式的String。例如:

    Object input = "{\"key1\":{},\"key2\":{}}";
    Map<String, Object> map = new ObjectMapper().readValue((String) input, new TypeReference<Map<String, Object>>() {});
    
    System.out.println(map.size()); // 2