You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Jackson将MultiValueMap正确转换为JSON?

查询参数转JSON:单值字段避免被序列化为数组

问题根源

你当前返回的MultiValueMap<String, String>会被Jackson默认序列化为所有值都是数组格式,哪怕只有单个值的字段(比如field2=value2)也会变成["value2"],不符合你要的单值为字符串、多值为数组的需求。

解决方案:更换集合类型为Map<String, Object>

不需要保留MultiValueMap,而是将其转换为Map<String, Object>,根据参数值的数量动态决定存字符串还是列表:

修改后的代码

@JsonGetter("queryString")
public Map<String, Object> getQueryString() {
    String queryString = Optional.ofNullable(httpRequest.getQueryString()).orElse("");
    MultiValueMap<String, String> queryParams = UriComponentsBuilder.fromUriString("?" + queryString).build().getQueryParams();
    
    Map<String, Object> resultMap = new HashMap<>();
    for (Map.Entry<String, List<String>> entry : queryParams.entrySet()) {
        List<String> values = entry.getValue();
        if (values.size() == 1) {
            resultMap.put(entry.getKey(), values.get(0));
        } else {
            resultMap.put(entry.getKey(), values);
        }
    }
    return resultMap;
}

为什么选择Map<String, Object>

因为你无法预知字段类型,Object可以兼容String(单值场景)和List<String>(多值场景)两种情况。Jackson序列化时会自动识别类型:

  • 当值是String时,输出为字符串格式("field2": "value2")
  • 当值是List<String>时,输出为数组格式("field1": ["value1", "value3"])

内容的提问来源于stack exchange,提问作者Hamza Ince

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:05:39