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

使用Gson解析JSON文件为Java对象时出现语法异常问题

问题原因分析

你遇到的JsonSyntaxException完全是因为JSON结构和你告诉Gson要解析的类型不匹配导致的。看你的test.json,根节点是一个JSON对象,里面包含了EventRecords这个数组字段,但你在代码里直接让Gson把整个JSON解析成List<Record>——Gson一开始就去找数组的起始标记[,结果看到的是对象的{,自然就抛出异常了。

解决方案

有两种简单的修复方式,你可以选一种适合自己的:

方法1:创建匹配JSON根结构的实体类

这种方式更符合面向对象的编码习惯,逻辑也更清晰。你只需要新增一个根实体类,用来包裹EventRecords数组:

public class EventRoot {
    private List<Record> EventRecords;

    // 生成getter和setter方法
    public List<Record> getEventRecords() {
        return EventRecords;
    }

    public void setEventRecords(List<Record> eventRecords) {
        EventRecords = eventRecords;
    }
}

然后修改GsonParser里的解析逻辑,把目标类型换成EventRoot:

public void jsonEncoder(String filePath) throws IOException {
    Gson gson = new Gson();
    BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
    // 先解析根对象
    EventRoot eventRoot = gson.fromJson(bufferedReader, EventRoot.class);
    // 再取出里面的Record列表
    List<Record> records = eventRoot.getEventRecords();
    System.out.println("\n\nEventRecords\n\n" + records.toString());
}

方法2:直接解析JsonObject再提取数组

如果你不想新增实体类,可以先把整个JSON解析成JsonObject,然后手动取出EventRecords数组再解析:

public void jsonEncoder(String filePath) throws IOException {
    Gson gson = new Gson();
    Type listType = new TypeToken<List<Record>>(){}.getType();
    BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
    
    // 先解析成JsonObject
    JsonObject jsonObject = gson.fromJson(bufferedReader, JsonObject.class);
    // 取出EventRecords对应的JsonArray
    JsonArray jsonArray = jsonObject.getAsJsonArray("EventRecords");
    // 再把JsonArray解析成List<Record>
    List<Record> records = gson.fromJson(jsonArray, listType);
    
    System.out.println("\n\nEventRecords\n\n" + records.toString());
}
验证

两种方法都能正确解析你的test.json,因为它们都先处理了根对象,再提取里面的数组。你的Record类是完全没问题的,不用做任何修改。

内容的提问来源于stack exchange,提问作者nad87563

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:43:49