结合Jackson使用多值Map

bvuwiixz  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(111)

您好我正在尝试从以下json创建一个对象:

{
    "property1": "value1",
    "property2": [
        {"key1":"value1"},
        {"key1":"value2"},
        {"key2":"value1"}
    ]
}

我使用MultiValuedMap的原因是因为属性2中的键可以重复(对于值)。
问题是当我尝试这样的操作时,jackson抛出了一个错误:

@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@EqualsAndHashCode
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MyClass {

    private String property1;

    private List<MultiValuedMap<String, String>> property2;

}

至于控制器是这样的:

@PostMapping(value = "update")
MyClass saveMyClass(@RequestBody @Valid MyClass myClass);

但是当尝试将json发送到我的api时,它会出现以下错误:
异常错误类型:类型定义错误:[简单类型,类org.apache.commons.collections4.多值Map];嵌套的异常是com.fasterxml.jackson.数据绑定.exc。无效定义异常:无法建构org.apache.commons.collections4.MultiValuedMap的执行严修(不存在建立者,例如预设建构函式):抽象类型需要Map到具体类型,具有自定义反序列化程序,或者包含其他类型信息

bnlyeluc

bnlyeluc1#

为什么不直接使用List〈Map.Entry〈String,String〉〉呢?
这是开箱即用的,如果你真的想使用一个MuliValuedMap,你可以把List转换成一个带有以下代码的Map:

var map = new ArrayListValuedHashMap<String, String>();
result.property2.stream()
                        .collect(Collectors.groupingBy(Map.Entry::getKey))
                        .entrySet()
                        .forEach(entry ->
                                         map.putAll(entry.getKey(),
                                                    entry.getValue().stream().map(Map.Entry::getValue).toList()));

相关问题