package com.vincent.rsf.server.manager.utils; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * @author chen.lin * @time 2026-02-02 * Areas 字段自定义反序列化器 * 支持两种格式: * 1. [1, 2, 3] - 纯ID数组(向后兼容) * 2. [{"id": 1, "sort": 1}, {"id": 2, "sort": 2}] - 对象数组(新格式) * * */ public class AreasDeserializer extends JsonDeserializer>> { @Override public List> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { JsonToken currentToken = p.getCurrentToken(); // 处理 null 值 if (currentToken == JsonToken.VALUE_NULL) { return new ArrayList<>(); } // 处理数组 if (currentToken == JsonToken.START_ARRAY) { List> result = new ArrayList<>(); JsonToken token = p.nextToken(); while (token != null && token != JsonToken.END_ARRAY) { if (token == JsonToken.VALUE_NUMBER_INT) { // 处理纯ID数组格式 [1, 2, 3] int id = p.getIntValue(); Map area = new HashMap<>(); area.put("id", id); area.put("sort", result.size() + 1); // 默认排序 result.add(area); token = p.nextToken(); } else if (token == JsonToken.START_OBJECT) { // 处理对象数组格式 [{"id": 1, "sort": 1}] ObjectMapper mapper = (ObjectMapper) p.getCodec(); @SuppressWarnings("unchecked") Map area = mapper.readValue(p, Map.class); result.add(area); token = p.nextToken(); } else { token = p.nextToken(); } } return result; } // 如果既不是数组也不是null,返回空列表 return new ArrayList<>(); } }