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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:55:14