如何从Map映射到List

iro*_*haw 5 java modelmapper

我正在开发一个项目,我需要从层次结构Map<String, Object>中映射,其中第二个参数应该是a StringMap<String, Object>.到目前为止,ModelMapper工作得很棒,但我遇到了特定转换的问题.鉴于以下内容,其中Model只是一个标记界面:

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

假设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");
        }});
    }});
}};
Run Code Online (Sandbox Code Playgroud)

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

提前感谢您的意见!

编辑

我试图建立一个Converter将管理从转换MapCollection<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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这有两个问题:

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

And*_*hin 0

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

void setOranizations(Map<String, Organization> map) {
    this.organizations = map.values();
}
Run Code Online (Sandbox Code Playgroud)