如何将具有平面属性的地图(prop1.prop2.prop3)转换为POJO

时间:2016-04-07 02:50:21

标签: java jackson type-conversion mapping pojo

我有以下用例:

我有地图属性:

Map <String, String[]> args = new HashMap(){{
put("requester.firstName", "Alice");
put("requester.lastName", "Smith");
put("requester.address", "Glasgow Av");
put("publication.type", "print");
put("publication.subtype", "book");
}};

我需要将它转换为此pojo

public class WebRequest{
private Requester requester;
private Publication publication;
}

class Requester{
private String firstName;
private String lastName;
private String address;
}

class Publication{
private String type;
private String subType;
}

我可以使用杰克逊进行转换吗?如果没有,那么最适合的库是什么?

谢谢,

Nadiia

2 个答案:

答案 0 :(得分:0)

您可以使用常见的apache BeanUtils。该框架几乎可以立即从Map映射到bean。

Map<String,String> yourMap = new HashMap<String,String>();
yourMap.put("name", "Joan");
yourMap.put("age", "30");

YourBean p = new YourBean();

try {
    BeanUtils.populate(p, yourMap);
}  catch (Throwable e) {
    //do something...
}

我不确定的是它是否会自动识别嵌套对象和相应的属性,但也许您可以手动执行此操作(通过提供2个地图等)。

可在此处找到更多信息BeanUtils

答案 1 :(得分:0)

我在StackOverflow上找到了解决我问题的优秀解决方案。类似的问题,
BeanUtils converting java.util.Map to nested bean

其中一个答案是完美的:

你应该使用Spring的BeanWrapper类。它支持嵌套属性,并可选择为您创建内部bean:

BeanOne one = new BeanOne();
BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(one);
wrapper.setAutoGrowNestedPaths(true);

Map<String, Object> map = new HashMap<>();
map.put("fieldOne", "fieldOneValue");
map.put("fieldTwo.fieldOne", "fieldOneValue");

wrapper.setPropertyValues(map);

assertEquals("fieldOneValue", one.getFieldOne());
BeanTwo two = one.getFieldTwo();
assertNotNull(two);
assertEquals("fieldOneValue", two.getFieldOne();

我希望它会帮助有类似问题的人。