首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何与杰克逊正确地将MultiValueMap转换为Json

如何与杰克逊正确地将MultiValueMap转换为Json
EN

Stack Overflow用户
提问于 2022-09-22 15:06:47
回答 1查看 176关注 0票数 0

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

例如:

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

  • 应返回:
代码语言:javascript
复制
"queryString": {
    "field1": [
      "value1",
      "value3"
    ],
    "field2": "value2"
}
  • 但我拥有的是:
代码语言:javascript
复制
"queryString": {
    "field1": [
        "value1",
        "value3"
    ],
    "field2": [
        "value2"
    ]
}

对于field2,我希望值是"value2",而不是数组"value2"

守则是:

代码语言:javascript
复制
@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>
EN

回答 1

Stack Overflow用户

发布于 2022-09-28 21:54:27

根据定义,MultiValueMap存储一个键和一个值列表,所以序列化看起来像{"key":["value1", "value2"]}是有意义的。

假设这是您想要做的事情,下面是几种方法:

  1. 在我看来,您似乎知道您希望了解的field1field2的类型,这样您就可以定义一个类来很好地捕获该信息:
代码语言:javascript
复制
    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() )。
代码语言:javascript
复制
    @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. 根据您的使用方式,您还可以定义一个自定义序列化程序

注在这些示例中可能需要处理额外的边缘情况,例如空列表和空列表。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73816939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档