如何反序列化嵌套列表结构JSON数组并转换为List类型
二维嵌套JSON数组反序列化方案
你给出的是典型的表头+数据行格式的二维JSON数组:
- 数组第一个元素是字符串组成的字段表头
- 后续每个元素是和表头顺序对应的数值/字符串/空值数据行
这种结构不需要写复杂的自定义反序列化器,按「先解析通用嵌套列表,再做字段映射」的逻辑处理即可,不同技术栈的实现方式如下:
Java 实现(Jackson 为例)
如果最终需要得到强类型的List<自定义实体>结构,参考以下代码:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.core.type.TypeReference; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; public class JsonParseTest { public static void main(String[] args) throws Exception { String jsonContent = "[[\"id\",\"date\",\"time\",\"start_time\",\"end_time\",\"sc_name\"],[121329387,\"2022-05-07\",null,null,null],[123863076,\"2022-12-05\",null,null,null]]"; ObjectMapper objectMapper = new ObjectMapper(); // 第一步:解析为无类型嵌套列表 List<List<Object>> rawData = objectMapper.readValue(jsonContent, List.class); // 提取表头 List<String> fieldNames = (List<String>)(List<?>)rawData.get(0); // 处理后续数据行,映射为字段名-值的Map结构 List<Map<String, Object>> mappedData = rawData.subList(1, rawData.size()).stream() .map(row -> IntStream.range(0, fieldNames.size()) .boxed() .collect(Collectors.toMap( fieldNames::get, index -> index < row.size() ? row.get(index) : null )) ).collect(Collectors.toList()); // 如需转自定义实体类,直接做类型转换即可,例: // List<Record> recordList = objectMapper.convertValue(mappedData, new TypeReference<List<Record>>() {}); } // 自定义实体示例,字段名和表头保持一致即可 // static class Record { // private Long id; // private String date; // private String time; // private String start_time; // private String end_time; // private String sc_name; // // 补全getter、setter // } }
如果用Gson、Fastjson等其他JSON库,逻辑完全一致,只需要替换第一步解析通用列表的API即可。
Python 实现
用Python标准库json模块处理逻辑更简洁:
import json json_content = '[["id","date","time","start_time","end_time","sc_name"],[121329387,"2022-05-07",null,null,null],[123863076,"2022-12-05",null,null,null]]' raw_data = json.loads(json_content) headers = raw_data[0] # 直接映射为字典列表 result = [dict(zip(headers, row)) for row in raw_data[1:]]
注意事项
- 你给出的示例中存在「表头字段数多于数据行值数量」的情况,映射时需要给缺失的字段补null,避免索引越界
- 不要尝试直接把整个JSON数组直接映射为强类型实体列表,第一行表头是字符串列表,和后续数据行结构不一致,会触发类型转换错误
内容的提问来源于stack exchange,提问作者Bibin Youhanan
相关产品推荐
相关产品推荐

