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

如何在Jackson中自定义反序列化,将List<String>转为逗号分隔字符串存入Map

自定义JSON反序列化器实现List转逗号分隔字符串并存入Map<String,String>

直接用Jackson的自定义反序列化器就能搞定这个需求,核心思路是遍历JSON的所有字段,对指定的codes数组做特殊处理,把元素拼接成逗号分隔的字符串,其他字段直接转成String存入Map。

第一步:编写自定义反序列化器类

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class StringMapDeserializer extends JsonDeserializer<Map<String, String>> {
    @Override
    public Map<String, String> deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        Map<String, String> resultMap = new HashMap<>();
        JsonNode rootNode = parser.getCodec().readTree(parser);
        Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields();
        
        while (fields.hasNext()) {
            Map.Entry<String, JsonNode> entry = fields.next();
            String key = entry.getKey();
            JsonNode valueNode = entry.getValue();
            
            if ("codes".equals(key) && valueNode.isArray()) {
                // 将数组元素拼接为逗号分隔的字符串
                StringBuilder sb = new StringBuilder();
                for (JsonNode element : valueNode) {
                    if (sb.length() > 0) {
                        sb.append(",");
                    }
                    sb.append(element.asText());
                }
                resultMap.put(key, sb.toString());
            } else {
                // 其他字段直接转为字符串存入Map
                resultMap.put(key, valueNode.asText());
            }
        }
        return resultMap;
    }
}

第二步:注册并使用反序列化器

把自定义反序列化器注册到Jackson的ObjectMapper中,即可完成目标反序列化:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;

public class Demo {
    public static void main(String[] args) throws IOException {
        String json = "{\n" +
                "  \"frequency\": \"Daily\",\n" +
                "  \"level\": \"Standard\",\n" +
                "  \"id\": \"1234\",\n" +
                "  \"name\": \"test user\",\n" +
                "  \"codes\": [\n" +
                "    \"177\",\n" +
                "    \"989\"\n" +
                "  ]\n" +
                "}";
        
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        // 为Map类型绑定自定义反序列化器
        module.addDeserializer(Map.class, new StringMapDeserializer());
        mapper.registerModule(module);
        
        Map<String, String> result = mapper.readValue(json, Map.class);
        System.out.println(result.get("codes")); // 输出:177,989
    }
}

扩展说明

如果后续还有其他数组字段需要转成逗号分隔字符串,只需修改反序列化器里的判断逻辑即可,比如把需要处理的字段名存入集合批量判断:

Set<String> arrayFields = new HashSet<>(Arrays.asList("codes", "tags"));
if (arrayFields.contains(key) && valueNode.isArray()) {
    // 复用拼接逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:39:57