使用Simple JSON库从JSON文件取值并映射至Java类对象
实现JSON数据到Java对象的映射并存入ArrayList
核心问题说明
你当前测试代码的错误在于:JSON顶层对象的键是字符串类型的"1""2""3",并非数字索引,所以调用jsonObject.get(0)会返回null。另外json-simple属于轻量JSON解析库,本身没有自动对象映射能力,需要手动解析,或者换用更便捷的Jackson库实现自动映射。
步骤1:定义Java实体类
先创建与JSON子结构对应的实体类,用来存储单条数据:
import java.util.List; import com.fasterxml.jackson.annotation.JsonProperty; // 仅Jackson方案需要 public class StreamItem { private List<String> path; // JSON里的键是"Des",和属性名des不匹配,用@JsonProperty指定映射关系 @JsonProperty("Des") private List<String> des; // 无参构造器(Jackson等库必须) public StreamItem() {} // 全参构造器 public StreamItem(List<String> path, List<String> des) { this.path = path; this.des = des; } // Getter和Setter方法 public List<String> getPath() { return path; } public void setPath(List<String> path) { this.path = path; } public List<String> getDes() { return des; } public void setDes(List<String> des) { this.des = des; } // 重写toString方便查看结果 @Override public String toString() { return "StreamItem{" + "path=" + path + ", des=" + des + '}'; } }
方案一:用json-simple手动解析
手动遍历JSON键值对,将数据封装到实体类并加入ArrayList:
import java.io.FileReader; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; public class JsonSimpleParseDemo { public static void main(String[] args) { JSONParser parser = new JSONParser(); List<StreamItem> itemList = new ArrayList<>(); try { // 读取并解析JSON文件 Object obj = parser.parse(new FileReader("C:/Users/dell/Desktop/streams.json")); JSONObject rootObj = (JSONObject) obj; // 获取顶层对象的所有键("1""2""3") Set<String> keys = rootObj.keySet(); for (String key : keys) { // 获取每个子对象 JSONObject itemJson = (JSONObject) rootObj.get(key); // 解析path数组 JSONArray pathArray = (JSONArray) itemJson.get("path"); List<String> path = new ArrayList<>(); for (Object elem : pathArray) { path.add((String) elem); } // 解析Des数组 JSONArray desArray = (JSONArray) itemJson.get("Des"); List<String> des = new ArrayList<>(); for (Object elem : desArray) { des.add((String) elem); } // 创建实体类对象并加入集合 itemList.add(new StreamItem(path, des)); } // 打印验证结果 for (StreamItem item : itemList) { System.out.println(item); } } catch (Exception e) { e.printStackTrace(); } } }
方案二:用Jackson实现自动映射(更简洁高效)
Jackson是主流JSON处理库,能自动完成JSON到Java对象的映射,无需手动解析数组和键值对。
第一步:引入Jackson依赖
如果用Maven,在pom.xml中添加:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 使用最新稳定版本即可 --> </dependency>
第二步:编写解析代码
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.util.ArrayList; import java.util.Map; public class JacksonParseDemo { public static void main(String[] args) { ObjectMapper mapper = new ObjectMapper(); List<StreamItem> itemList = new ArrayList<>(); try { // 将JSON解析为Map<String, StreamItem>,再把Map的值转为ArrayList Map<String, StreamItem> itemMap = mapper.readValue( new File("C:/Users/dell/Desktop/streams.json"), mapper.getTypeFactory().constructMapType(Map.class, String.class, StreamItem.class) ); itemList.addAll(itemMap.values()); // 打印验证结果 for (StreamItem item : itemList) { System.out.println(item); } } catch (Exception e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者Ayham Ahmad
相关产品推荐
相关产品推荐

