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

