Java中如何将JSON文件转为可读对象并访问数组元素属性
解决方案
使用Jackson的ObjectMapper将JSON反序列化为原生Map类型时,JSON数组会默认映射为Java的ArrayList,JSON对象会默认映射为LinkedHashMap。你之前将res字段的返回值存为Object类型,无法调用集合的操作方法,按如下方式修改代码即可实现需求。
访问res数组的第二个对象
Java集合的下标从0开始计数,第二个元素对应下标为1。将res对应的返回值强转为List类型后,调用get(1)即可获取第二个对象。
给你两种写法,新手可以先用简单写法:
简单写法(无泛型,适合快速验证)
InputStream jsonfile= this.getClass().getClassLoader().getResourceAsStream("test.json"); assert jsonfile!= null; ObjectMapper mapper = new ObjectMapper(); Map jsonMap = mapper.readValue(jsonfile, Map.class); // 将res结果强转为List类型 List records = (List) jsonMap.get("res"); // 获取第二个对象,下标从0开始,第二个对应索引1 Map secondObj = (Map) records.get(1); System.out.println(secondObj);
规范写法(带泛型,类型安全)
如果想避免编译期的unchecked警告,可以借助Jackson提供的TypeReference指定泛型类型:
import com.fasterxml.jackson.core.type.TypeReference; // ...省略其他代码 Map<String, Object> jsonMap = mapper.readValue(jsonfile, new TypeReference<Map<String, Object>>() {}); List<Map<String, String>> records = (List<Map<String, String>>) jsonMap.get("res"); Map<String, String> secondObj = records.get(1);
遍历对象内的键名和值
拿到单个对象对应的Map实例后,就可以通过Map的遍历方法拿到所有键(比如你提到的test1、test2)和对应的值,两种常用遍历方式如下:
// 遍历res数组下的所有对象 for (Object record : records) { Map item = (Map) record; // 方式1:先取所有键名,再按键取值 for (Object key : item.keySet()) { Object value = item.get(key); System.out.println("键名:" + key + ",值:" + value); } // 方式2:直接遍历键值对,性能更好,推荐使用 for (Object entryObj : item.entrySet()) { Map.Entry entry = (Map.Entry) entryObj; Object key = entry.getKey(); Object value = entry.getValue(); System.out.println("键名:" + key + ",值:" + value); } }
补充建议:如果JSON结构固定,更推荐你定义和JSON结构对应的Java实体类,直接让
ObjectMapper把JSON反序列化为实体类对象,不需要手动做类型转换,代码可读性和稳定性都会更高。
内容的提问来源于stack exchange,提问作者echobravocharlie
相关产品推荐
相关产品推荐

