如何用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
相关产品推荐
相关产品推荐

