Java读取resources目录JSON文件(含嵌套数组)生成对象列表方法
问题场景
需要通过Java读取JSON文件并将内容转换为对象列表,当前解析遇到两个核心难点:
- 待解析JSON的根节点是数组,而非常规的单个JSON对象
- 一级数组的每个元素内部还包含嵌套的子数组,无法完成正确的字段映射
待解析的JSON结构如下(注:原JSON存在语法笔误,name字段名后缺失闭合双引号,解析前需先修正):
[ { "name": "Andrew", "age": 21, "parents": [ { "name": "Joseph", "age": 18 }, { "name": "Joseph", "age": 18 } ] }, { "name": "Maria", "age": 35, "parents": [ { "name": "Kassandra", "age": 16 }, { "name": "Abigail", "age": 22 } ] } ]
实现方案
直接用Java生态主流的JSON序列化类库就能搞定,Jackson和Gson是目前生产环境用得最多的两个选项,两者都原生支持根节点为数组的JSON解析,也能自动完成嵌套数组、嵌套对象的字段映射,完全不需要手动逐层拆节点。
具体操作流程:
- 先写两个和JSON结构匹配的普通Java类:
一个对应外层数组的元素,比如叫Person,字段和JSON里的一级key对应:字符串类型的name、整数类型的age、List<Parent>类型的parents;
另一个对应parents数组里的子元素,比如叫Parent,字段就是字符串类型的name、整数类型的age,字段名和JSON里的key保持一致就行,不需要额外加注解。 - 解析的时候不要硬套“根节点必须是对象”的思路,两个类库都提供了泛型类型参数来支持集合类型的根节点:
用Jackson的话,创建ObjectMapper实例,调用readValue方法读JSON输入源的时候,第二个参数传new TypeReference<List<Person>>(){},方法返回的结果直接就是List<Person>类型,里面的parents字段会自动映射成List<Parent>,不需要额外处理。
用Gson的话逻辑完全一致,创建Gson实例,调用fromJson方法的时候,第二个参数传new TypeToken<List<Person>>(){}.getType(),就能直接拿到目标对象列表。 - 注意先排查JSON本身的语法问题:原示例JSON里两处
"name: "Andrew"、"name: "Maria"的name字段名后面都少了闭合双引号,属于非法JSON格式,这种情况不管用什么类库都会解析失败,先把JSON语法修正再跑解析逻辑。
2022年11月6日 编辑:我已经整理了完整的可运行实现方案记录,在此感谢所有提供思路和帮助的开发者。
内容的提问来源于stack exchange,提问作者Guilherme Gonzalez
相关产品推荐
相关产品推荐

