java - 从 JSON 到 DTO 的智能映射结构映射

标签 java spring mapstruct

我正在开发一个 Spring 应用程序,并使用 Spring Webclient 对外部服务进行 REST 调用。结果,我有这个对象:

{
    "error": 0,
    "message": "",
    "totalItems": 1,
    "entities": [
        [
            {
                "entityName": "Field 1",
                "entityValue": "String value 1"
            },
            {
                "entityName": "Field 2",
                "entityValue": "Date Value 2 in dd-mm-yyyy format"
            }
        ]
    ]
}

现在我想创建一个包含两个字段(字符串字段1和日期字段2)的DTO,并告诉mapstruct使用与entityName字段1相对应的entityValue填充field1,字段2也是如此。我如何在a中实现这一点聪明的方法?理想情况下,无需循环每个实体中的所有实体名称/实体值对。

现在我有两个 DTO 代表我的 REST 结果:

public class Wrapper {
    private int error;
    private String message;
    private int totalItems;
    private List<PairEntity> entities;
}
and 
public class PairEntity {
    private String entityName;
    private String entityValue;
}

最佳答案

包含一点循环...

如果entityName是唯一的,请将您的 dto 更改为使用 Map<String, String>Map<String, PairEntity> (键=实体名称)而不是List<PairEntity> 。您需要一个自定义的 jackson 映射器或 gson,具体取决于正在使用的库...

或者创建一个新的 dto 并手动将列表转换为 map 。

然后在mapstruct中创建自定义映射并从映射中获取值。

https://www.baeldung.com/java-list-to-map

https://www.baeldung.com/jackson-deserialization

https://www.baeldung.com/mapstruct-custom-mapper

关于java - 从 JSON 到 DTO 的智能映射结构映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72866597/

相关文章:

java - Spring:将某种类型的数组或列表注入(inject) bean

java - Mapstruct:如何将两个字段合并为一个

java - 映射结构 : Dealing with HashMap entries as source

java - 枚举的反序列化不起作用 - Jackson

Java——如何使用 args[] 调用方法?

java - 如何将所有 memberOf 属性分配给 LDAP 中的特定用户

java - mapstruct 未在双向 OneToMany 上正确设置关系

java - 在Java中创建通用有序链表,使用compareTo()时遇到问题

java - 我可以在 Camunda 中有两个并行接收任务吗?

java - Spring boot中如何配置拦截器?