如何使用Jackson将含List<String>字段的POJO转换为MultiValueMap
问题
需要将POJO转换为MultiValueMap<String, String>(即请求参数RequestParams)。
POJO类:
public class Foo { String fooStr; int fooInt; List<String> fooList; }
转换代码:
public static MultiValueMap<String, String> convert( Object obj ) { MultiValueMap<String, String> requestParamMultiValueMap = new LinkedMultiValueMap<>(); Map<String, String> requestParamMap = new ObjectMapper() .convertValue( obj, new TypeReference<Map<String, String>>() {} ); // 此处抛出异常 requestParamMultiValueMap.setAll( requestParamMap ); return requestParamMultiValueMap; }
当Foo类仅包含String类型成员变量时转换正常,但包含List<String>类型成员变量时,会抛出如下异常:
IllegalArgumentException: Cannot deserialize value of type java.lang.String from Array value (token JsonToken.START_ARRAY).
请问如何使用Jackson将含List<String>字段的POJO转换为MultiValueMap?
解决方案
直接用Map<String, Object>作为中间转换类型,再遍历处理每个字段:
public static MultiValueMap<String, String> convert(Object obj) { MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>(); ObjectMapper mapper = new ObjectMapper(); // 先转成Map<String, Object>,兼容各种类型的字段 Map<String, Object> objMap = mapper.convertValue(obj, new TypeReference<Map<String, Object>>() {}); for (Map.Entry<String, Object> entry : objMap.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); if (value == null) { continue; } // 处理集合类型(包括List) if (value instanceof Collection) { Collection<?> collection = (Collection<?>) value; for (Object item : collection) { multiValueMap.add(key, item != null ? item.toString() : null); } } // 处理数组类型(可选,按需添加) else if (value.getClass().isArray()) { Object[] array = (Object[]) value; for (Object item : array) { multiValueMap.add(key, item != null ? item.toString() : null); } } // 处理单个值类型 else { multiValueMap.add(key, value.toString()); } } return multiValueMap; }
说明
- 原代码报错是因为强行将
List<String>转成String类型,Jackson无法完成这种类型转换。改用Map<String, Object>可以保留原字段的类型信息,之后再根据字段类型分别处理。 - 对于集合/数组类型,遍历每个元素并调用
multiValueMap.add(key, value),这样就能生成符合请求参数格式的多值结构(比如fooList=value1&fooList=value2)。 - 单个值直接调用
add方法,和set效果一致,但统一用add更规范。
内容的提问来源于stack exchange,提问作者Rurien
相关产品推荐
相关产品推荐

