是否可以将此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调用,我无法修改源。
您可以使用中间哈希表进行转换。请尝试以下示例转换器。备注:您可能想要更改为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;
}