无法将完整JSON文件反序列化为ArrayList,仅读取到首个条目
JSON反序列化为ArrayList仅读取到第一个条目的修复方案
以下是该问题的高频触发原因及对应修复方法:
原因1:源JSON不符合标准数组格式
很多人容易把JSON Lines格式(每行一个独立JSON对象)当成标准数组来解析,比如文件内容为多个无逗号分隔、无外层方括号的独立对象:{"id":1,"name":"test1"} {"id":2,"name":"test2"}这种格式用数组反序列化逻辑只能读到第一个对象,后续内容会被截断。
修复方法二选一:- 调整源JSON为标准数组格式,外层加
[]、对象之间加英文逗号分隔 - 改为按行读取文件,逐行反序列化单个对象后存入ArrayList
- 调整源JSON为标准数组格式,外层加
原因2:反序列化代码未指定集合类型,仅单次读取对象
以常用的Jackson解析库为例,错误写法只会读取一次对象就停止:// 错误示例 ObjectMapper objectMapper = new ObjectMapper(); User singleUser = objectMapper.readValue(new File("user.json"), User.class); ArrayList<User> userList = new ArrayList<>(); userList.add(singleUser);正确写法需要通过TypeReference指定反序列化目标为ArrayList类型:
// 正确示例 ObjectMapper objectMapper = new ObjectMapper(); TypeReference<ArrayList<User>> typeRef = new TypeReference<ArrayList<User>>() {}; ArrayList<User> userList = objectMapper.readValue(new File("user.json"), typeRef);原因3:后续条目字段和实体类不匹配,反序列化失败被静默丢弃
大部分JSON解析库默认会忽略未知字段或者类型不匹配的对象,不会抛出异常,导致后续条目直接丢失。
排查方法:开启解析失败抛异常配置,Jackson配置示例:objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true); objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, true);运行后如果抛出字段不匹配异常,要么调整实体类字段和JSON字段完全对应,要么在实体类上加
@JsonIgnoreProperties(ignoreUnknown = true)注解忽略非必要的未知字段。原因4:使用流解析时仅处理了第一个对象就退出循环
如果用JsonParser等流式API手动解析,检查是否循环逻辑存在问题,仅读取了第一个START_OBJECT后就跳出循环,未遍历到数组的END_TOKEN。
内容的提问来源于stack exchange,提问作者user12835495
相关产品推荐
相关产品推荐

