如何将一个Map映射为List?

5

我正在开发一个项目,需要从一个分层的Map<String, Object>进行映射,其中第二个参数应该是一个String或者Map<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放弃映射键,而仅使用值列表来推入organizations属性呢?如果失败,organizations属性将为空。你可以假设我有一个很好的理由希望这样做,但这只是一个反例!感谢您提前的支持!
编辑
我尝试构建一个转换器来管理从Map到Collection的转换,但没有成功。给定:
new Converter<Map, Collection<DataTransportObject>>() {
    @Override
    public Set convert(MappingContext<Map, Collection<DataTransportObject>> context) {
        LOG.debug("Here");
        Set<DataTransportObject> result = new HashSet<>();
        return result;
    }
}

这里有两个问题:

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

在你的问题的不同部分似乎要求不同的事情。你想将你的Map转换为一个“Client”实例,还是想将它转换为List? - VGR
给定的地图应该转换为一个“Client”实例。但是目前,ModelMapper将无法处理“organizations”属性,并且会将其留空。我希望能让ModelMapper将映射值列表推送到“organizations”属性中。 - ironhardchaw
我认为您需要使用BeanUtils或ObjectMapper。您可以在以下链接中查看答案:https://dev59.com/yHRB5IYBdhLWcg3wCjjO - Andrey Pushin
我已经阅读了那个答案,但不确定是否找到我要寻找的内容。 我在考虑将一个 map 转换为对象,而不是反过来。 我会研究 ObjectMapper 的使用,因为我已经尝试过 BeanUtils。 - ironhardchaw
1个回答

0
在您的情况下,我认为您可以为Pojo类使用额外的setter。然后,为了将map转换为对象,请使用ObjectMapper/BeanUtils等库。例如:
void setOranizations(Map<String, Organization> map) {
    this.organizations = map.values();
}

这个问题的关键是将地图作为值列表塞进集合中。问题在于我得到了一个具有任意键和任意值的分层地图,我需要能够仅使用值列表而不需要键。 - ironhardchaw
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Andrey Pushin
简直不敢相信我没想到那个!虽然不完全是我想要的,但绝对是一个有效的解决方案。我尝试了使用ModelMapper和ObjectMapper一起使用,它适用于两者。如果你把你的评论转化成答案,我会将其标记为被接受的答案,因为它也适用于原始问题而不需要更改库。 - ironhardchaw
只是想指出,Jackson和随后的ObjectMapper需要使用@JsonSetter来注释setter,否则将使用公共字段。当给定选项时,ModelMapper似乎使用setter而不是字段。 - ironhardchaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接