如何将具有Object值的Map转换为适当的类型?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将具有Object值的Map转换为适当的类型?相关的知识,希望对你有一定的参考价值。

我正在一个项目中,我需要接受类型为properties的地图Map<String, Object>。此Map中可能会有许多不同的键,但我只关心一个:xpathxpath可以具有三种不同类型的值之一:

  1. 字符串,例如"xpath": "path/to/xml/tag"
  2. xpath的列表,例如:"xpath": ["path/to/xml/tag1", "tag2", "path/tag3"
  3. A Map<String, Map<String, Boolean>>,例如:

  "xpath":
  
    "path/to/xml":
    
      "setting1?": true,
      "setting2?": true
    ,
    "path/tag2":
    
      "setting1?": false,
      "setting2": true
    ,
    "path/to/tag3": null
  

现在我有三个变量:String xpath, Set<String> xpaths, Map<String, Map<String, boolean> xpathMap。我有一个应该尝试在"xpath"映射中映射properties键的值的函数,它看起来像这样:

private void decideXPathType(Map<String, Object> properties)
    
        Object propertiesXPath = properties.get("xpath");

        if (propertiesXPath instanceof String)
        
            this.xpath = (String) propertiesXPath;
         else if (propertiesXPath instanceof List)
        
            this.xpaths = new HashSet<String>((List) propertiesXPath);
         else if (propertiesXPath instanceof Map)
        
            for (Object key : ((Map) propertiesXPath).keySet())
            
                Map<String, Boolean> value = (Map<String, Boolean>) ((Map) propertiesXPath).get(key);
                this.xpathMap.put((String) key, value);
            
         else
        
            throw new IllegalArgumentException("the xpath value is neither String, List, or Map<String, Boolean>");
        
    

但是此功能看起来很糟糕-有很多转换等,尽管它可以工作,但看起来太乱了,我想可能会出问题...关于如何使此清洁器更清晰的任何想法?

编辑:更多详细信息

properties映射最初是我从服务中收到的json JsonNode requestBody。使用ObjectMapper,我将这样创建一个properties映射:

Map<String, Object> properties = new ObjectMapper().convertValue(new ObjectMapper().readTree(requestBody), new TypeReference<Map<String, Object>>());

如果我收到的json字符串是我提供的xpathMap示例的值,则会得到类似以下内容:enter image description here

希望此信息有帮助?

答案

在您的JSON中,对这些不同类型的值使用不同的键:StringListMap。根据this answer反序列化地图:

@Test
public void test() throws IOException 
    ObjectMapper om = new ObjectMapper();
    TypeFactory typeFactory = om.getTypeFactory();
    MapType mapType = typeFactory.constructMapType(HashMap.class, String.class, Map.class);

    InputStream inputStream = getClass().getClassLoader().getResourceAsStream("xpath.json");
    JsonNode jsonNode = om.readTree(inputStream);

    Map<String, Map<String, Boolean>> value = om.readValue(jsonNode.get("xpath").toString(), mapType);
    // prints path/to/xml=setting1?=true, setting2?=true, path/to/tag3=null, path/tag2=setting1?=false, setting2=true
    System.out.println(value);

以上是关于如何将具有Object值的Map转换为适当的类型?的主要内容,如果未能解决你的问题,请参考以下文章

将对象数组转换为包含键和值的对象作为对象数组

如何将具有数字值的 char 数据类型的列转换为数字数据类型

如何将 JsonNode 转换为 Map

将 Datatable 转换为具有空值的对象

将具有 nan 值的 str 类型字典转换为字典类型对象

如何使用 Java 8 Lambda 将对象列表转换为 Map<Object, Object>