如何使用Jackson正确地将MultiValueMap转换为Json

zkure5ic  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(1645)

我正在尝试返回从请求的查询中创建的Json。

例如:

url.com?field1=value1&field2=value2&field1=value3

  • 应返回:
"queryString": {
    "field1": [
      "value1",
      "value3"
    ],
    "field2": "value2"
}
  • 但我有的是:
"queryString": {
    "field1": [
        "value1",
        "value3"
    ],
    "field2": [
        "value2"
    ]
}

对于field2,我希望其值为**“value2”,而不是数组[“value2”]**。
代码为:

@JsonGetter("queryString")
public MultiValueMap<String, String> getQueryString() {
    String queryString = Optional.ofNullable(httpRequest.getQueryString()).orElse("");

    // queryString is for our example : field1=value1&field2=value2&field1=value3
    return UriComponentsBuilder.fromUriString("?" + queryString).build().getQueryParams();
}

我应该使用不同的集合吗?哪一个?

  • 精度:我不知道字段应该是什么类型,它可以是StringList<String>
toe95027

toe950271#

根据定义,MultiValueMap存储一个键和一个值列表,因此序列化看起来像{"key":["value1", "value2"]}是有意义的。
假设这是您想要做的,这里有几种方法可以做到这一点:
1.在我看来,您应该知道field1field2的类型,这样您就可以定义一个类来很好地捕获这些信息:

class MyClass {
        private final List<String> field1;
        private final String field2;

        public MyClass(List<String> field1, String field2) {
            this.field1 = field1;
            this.field2 = field2;
        }

        public List<String> getField1() {
            return field1;
        }

        public String getField2() {
            return field2;
        }
    }

    @JsonGetter("queryString")
    public MyClass getQueryString() {
        String queryString = "url.com?field1=value1&field2=value2&field1=value3";
        MultiValueMap<String, String> queryParams =  UriComponentsBuilder.fromUriString(queryString).build().getQueryParams();
        return new MyClass(queryParams.get("field1"), queryParams.getFirst("field2"));
    }

1.一个快速而简单的解决方案是简单地将MultiValueMap<String, String>转换为Map<String, Object>,这将获得您想要的序列化(基于MultiValueMapAdapter.toSingleValueMap()

@JsonGetter("queryString")
    public Map<String, Object> getQueryString() {
        String queryString = "url.com?field1=value1&field2=value2&field1=value3";
        MultiValueMap<String, String> queryParams =  UriComponentsBuilder.fromUriString(queryString).build().getQueryParams();
        Map<String, Object> singleValueMap = CollectionUtils.newLinkedHashMap(queryParams.size());
        for (Entry<String, List<String>> entry : queryParams.entrySet()) {
            if (entry.getValue() != null && !entry.getValue().isEmpty()) {
                if (entry.getValue().size() == 1) {
                    singleValueMap.put(entry.getKey(), entry.getValue().get(0));
                } else {
                    singleValueMap.put(entry.getKey(), entry.getValue());
                }
            }
        }
        return singleValueMap;
    }

1.根据您使用它的方式,您还可以定义custom serializer
请注意,在这些示例中,您可能需要处理一些额外的边缘情况,如空值和空列表。

相关问题