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<List<Map<String, Object>>> {
|
|
@Override
|
public List<Map<String, Object>> 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<Map<String, Object>> 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<String, Object> 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<String, Object> area = mapper.readValue(p, Map.class);
|
result.add(area);
|
token = p.nextToken();
|
} else {
|
token = p.nextToken();
|
}
|
}
|
return result;
|
}
|
|
// 如果既不是数组也不是null,返回空列表
|
return new ArrayList<>();
|
}
|
}
|