使用org.json.simple库解析JSON对象失败的问题求助
用org.json.simple解析嵌套JSON的解决方案
嘿,我来帮你搞定这个org.json.simple解析JSON的问题!先瞅一眼你给的JSON结构,它是多层嵌套的,外层是usageHistory,里面包含apiKey和一个data数组,数组里每个元素又是一个以时间为键的对象,咱们得一步步拆解它。
首先,先确保你已经正确引入了org.json.simple的依赖,如果是Maven项目,pom.xml里要加这段:
<dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1.1</version> </dependency>
接下来是具体的解析代码,我给你写个完整的示例,带注释,你可以直接参考:
import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import java.util.Map; public class JsonParserExample { public static void main(String[] args) { // 这里替换成你完整的JSON字符串(注意你给的JSON最后是截断的,要确保格式完整) String jsonStr = "{ \"usageHistory\": { \"apiKey\": \"--redacted--\", \"data\": [ { \"Yesterday\": { \"ActivePower\": \"43.730000000000004\", \"RemainingBalance\": \"2016469.050000007\" } }, { \"Last Week\": { \"ActivePower\": \"695.7100000000002\", \"RemainingBalance\": \"5909672.770000028\" } }, { \"Last Month\": { \"ActivePower\": \"3816.950000000011\", \"RemainingBalance\": \"1465006.8900000013\" } }, { \"Last6Months\": { \"Jan 18\": { \"ActivePower\": \"123\", \"RemainingBalance\": \"456\" } } } ] } }"; JSONParser parser = new JSONParser(); try { // 解析最外层JSON对象 JSONObject outerObj = (JSONObject) parser.parse(jsonStr); // 获取usageHistory对象 JSONObject usageHistory = (JSONObject) outerObj.get("usageHistory"); // 取出apiKey(如果需要的话) String apiKey = (String) usageHistory.get("apiKey"); System.out.println("API Key: " + apiKey); // 获取data数组 JSONArray dataArray = (JSONArray) usageHistory.get("data"); // 遍历data数组里的每个元素 for (Object item : dataArray) { JSONObject timeObj = (JSONObject) item; // 每个timeObj里只有一个键(比如Yesterday、Last Week),遍历它的entrySet for (Map.Entry<String, Object> entry : ((Map<String, Object>) timeObj).entrySet()) { String timeLabel = entry.getKey(); JSONObject metricsObj = (JSONObject) entry.getValue(); // 获取对应的指标值,注意这里是字符串类型,需要的话可以转成Double String activePower = (String) metricsObj.get("ActivePower"); String remainingBalance = (String) metricsObj.get("RemainingBalance"); System.out.println("\n时间区间: " + timeLabel); System.out.println("ActivePower: " + activePower); System.out.println("RemainingBalance: " + remainingBalance); } } } catch (ParseException e) { e.printStackTrace(); System.err.println("JSON解析失败,检查JSON格式是否完整有效!"); } catch (ClassCastException e) { e.printStackTrace(); System.err.println("类型转换错误,检查JSON结构是否和代码预期一致!"); } } }
几个要注意的坑:
- JSON格式完整性:你提供的JSON最后是
ActiveP...,明显是截断了,这肯定会导致解析失败,得先确保你的JSON是完整有效的,可以用在线JSON校验工具先检查一下。 - 类型转换:org.json.simple的方法返回的都是
Object,所以必须强制转换成对应的JSONObject或JSONArray,如果转换错了会抛出ClassCastException,记得加异常处理。 - 动态键处理:
data数组里的每个元素的键是动态的(Yesterday、Last Week等),所以不能直接用get("Yesterday"),得遍历entrySet来获取键和对应的值。
如果运行代码还是有问题,你可以把具体的错误信息贴出来,咱们再针对性解决!
内容的提问来源于stack exchange,提问作者JPG
相关产品推荐
相关产品推荐

