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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:15:38