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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:51:15