使用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
相关产品推荐
相关产品推荐

