如何从Map映射到List

时间:2014-11-28 17:31:22

标签: java modelmapper

我正在开展一个项目,我需要从分层Map<String, Object>进行映射,其中第二个参数应为StringMap<String, Object>。到目前为止,ModelMapper工作得很棒,但我遇到了特定转换的问题。鉴于以下内容,Model只是一个标记接口:

class Client implements Model {
    String firstName;
    String lastName;
    List<Organization> organizations = new ArrayList<>();
}

假设Organization实现了我的标记界面Model,但是其他任意结构,我希望能够将以下内容映射到Client

Map source = new HashMap(){{
    put("firstName", "John"),
    put("lastName", "Smith"),
    put("organizations", new HashMap(){{
        put("0", new HashMap(){{
            put("id", "1234");
        }});
        put("abc", new HashMap(){{
            put("id", "5678");
        }});
    }});
}};

总结:在推入组织属性时,如何让ModelMapper删除映射键并仅使用值列表?如果做不到这一点,组织的财产就会变空。您可能认为我有充分的理由希望这样做,而且这是一个糟糕的例子!

提前感谢您的意见!

修改

我尝试构建Converter来管理从Map转换为Collection<Model>无效的new Converter<Map, Collection<DataTransportObject>>() { @Override public Set convert(MappingContext<Map, Collection<DataTransportObject>> context) { LOG.debug("Here"); Set<DataTransportObject> result = new HashSet<>(); return result; } } 。给出:

Map

这有两个问题:

  1. 显然,ModelMapper不会查看继承,因此当给出HashMap的任何实现作为源时,转换器不会运行。例如,如果我将转换器更改为接受HashMap并传递context.getGenericDestinationType()作为来源,则可以正常工作。
  2. List返回Set或{{1}}个类,但没有通用信息。那么ModelMapper如何在正常情况下设法构建复杂的模型图?

1 个答案:

答案 0 :(得分:0)

在你的情况下,我认为你可以为Pojo类使用额外的setter。 然后将转换映射到对象使用库作为ObjectMapper / BeanUtils / .... 例如:

void setOranizations(Map<String, Organization> map) {
    this.organizations = map.values();
}