You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将完整JSON文件反序列化为ArrayList,仅读取到首个条目

JSON反序列化为ArrayList仅读取到第一个条目的修复方案

以下是该问题的高频触发原因及对应修复方法:

  • 原因1:源JSON不符合标准数组格式
    很多人容易把JSON Lines格式(每行一个独立JSON对象)当成标准数组来解析,比如文件内容为多个无逗号分隔、无外层方括号的独立对象:

    {"id":1,"name":"test1"}
    {"id":2,"name":"test2"}
    

    这种格式用数组反序列化逻辑只能读到第一个对象,后续内容会被截断。
    修复方法二选一:

    1. 调整源JSON为标准数组格式,外层加[]、对象之间加英文逗号分隔
    2. 改为按行读取文件,逐行反序列化单个对象后存入ArrayList
  • 原因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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:45:03