将HashMap转换为包含列表属性的对象

问题描述 投票:0回答:1

是否可以将此HashMap转换为相应的Object?也许使用Jackson Object Mapper,Gson甚至Mapstruct。这里的技巧是如何映射列表属性,即在我的INPUT中,属性名称中的数字为sufix:

Map<String, String> map = new HashMap<String, String>() {{
   put("fooName", "foo name");
   put("bars1.barName", "bar at position 0 name");
   put("bars1.barValue", "bar at position 0 value");
   put("bars2.barName", "bar at position 1 name");
   put("bars2.barValue", "bar at position 1 value");
}};

public class Foo {

    String fooName;
    List<Bar> bars;
// getters/setters    
}

public class Bar {

    String barName;
    String barValue;
// getters/setters
}

PS:此输入来自外部API调用,我无法修改源。

java jackson hashmap gson mapstruct
1个回答
0
投票

您可以使用中间哈希表进行转换。请尝试以下示例转换器。备注:您可能想要更改为Foo和Bar使用适当的构造函数,或使用setter。而且没有错误处理。

static Foo convertMap(Map<String, String> map){
    Foo foo = new Foo();
    foo.fooName = map.remove("fooName");

    Map<String, Bar> barsMap = new HashMap<String, Bar>();

    for(String key : map.keySet()){
      String[] split = key.split("\\.");
      String name = split[0];
      String attribute = split[1];

      Bar bar = null;
      if(barsMap.containsKey(name)){
        bar = barsMap.get(name);
      }
      else{
        bar = new Bar();
        barsMap.put(name, bar);
      }

      switch(attribute){
        case "barName": bar.barName = map.get(key); break;
        case "barValue": bar.barValue = map.get(key); break;
        default: break;
      }
    }

    foo.bars = new ArrayList(barsMap.values());

    return foo;
  }
© www.soinside.com 2019 - 2024. All rights reserved.