You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

JSON对象无法正确转换,如何提取JSON数组并在Java中使用?

解决嵌套转义JSON字符串的数组提取问题

我懂你现在卡在哪了——你的外层JSON里的FinalResult字段存的不是直接可用的JSON数组,而是一个被转义过的JSON字符串,所以直接解析外层对象后没法直接用这个数组,得做两步解析才行。

先看看你的原始JSON结构:

原始JSON数据:

{"FinalResult":"[{\"id\":11,\"organizationNameGE\":\"erer\",\"organizationNameEN\":\"rerer\",\"cardNumber\":\"3434343\",\"startDate\":\"02/04/2018\",\"period\":1,\"endDate\":\"02/06/2018\",\"priority\":\"middle important\",\"$$hashKey\":\"0QI\"}]"}

注意FinalResult的值被双引号包裹,而且内部的双引号都加了转义符\,这说明它是字符串类型,不是JSON数组类型,必须先提取这个字符串,再把它解析成数组。

用json-simple库的完整解决方案

你代码里用到了JSONParser,我默认你用的是json-simple库,下面是完整的可运行代码:

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JsonArrayExtraction {
    public static void main(String[] args) {
        // 你的原始JSON字符串
        String rawJson = "{\"FinalResult\":\"[{\\\"id\\\":11,\\\"organizationNameGE\\\":\\\"erer\\\",\\\"organizationNameEN\\\":\\\"rerer\\\",\\\"cardNumber\\\":\\\"3434343\\\",\\\"startDate\\\":\\\"02/04/2018\\\",\\\"period\\\":1,\\\"endDate\\\":\\\"02/06/2018\\\",\\\"priority\\\":\\\"middle important\\\",\\\"$$hashKey\\\":\\\"0QI\\\"}]\"}";
        
        JSONParser parser = new JSONParser();
        JSONObject jsonObjectR = null;
        
        try {
            // 第一步:解析外层的JSONObject
            jsonObjectR = (JSONObject) parser.parse(rawJson);
            
            // 第二步:提取FinalResult字段的转义字符串
            String finalResultStr = (String) jsonObjectR.get("FinalResult");
            
            // 第三步:把转义后的字符串解析成JSONArray
            JSONArray finalResultArray = (JSONArray) parser.parse(finalResultStr);
            
            // 现在就可以遍历数组使用里面的数据了
            for (Object item : finalResultArray) {
                JSONObject orgItem = (JSONObject) item;
                // 示例:提取并打印几个字段
                System.out.println("组织ID: " + orgItem.get("id"));
                System.out.println("英文名称: " + orgItem.get("organizationNameEN"));
                System.out.println("有效期至: " + orgItem.get("endDate"));
            }
            
        } catch (ParseException e) {
            e.printStackTrace();
            // 这里可以添加自定义的异常处理,比如日志记录、友好提示等
        }
    }
}

如果你用Gson/Jackson库的思路(可选)

如果项目里用的是更流行的Gson或Jackson,核心逻辑也是一样的:先解析外层对象拿到字符串,再把字符串反序列化成数组。比如Gson的示例:

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

public class GsonExtractionExample {
    public static void main(String[] args) {
        String rawJson = "{\"FinalResult\":\"[{\\\"id\\\":11,\\\"organizationNameGE\\\":\\\"erer\\\",\\\"organizationNameEN\\\":\\\"rerer\\\",\\\"cardNumber\\\":\\\"3434343\\\",\\\"startDate\\\":\\\"02/04/2018\\\",\\\"period\\\":1,\\\"endDate\\\":\\\"02/06/2018\\\",\\\"priority\\\":\\\"middle important\\\",\\\"$$hashKey\\\":\\\"0QI\\\"}]\"}";
        
        Gson gson = new Gson();
        // 解析外层对象
        JsonObject outerObj = gson.fromJson(rawJson, JsonObject.class);
        // 提取转义字符串
        String resultStr = outerObj.get("FinalResult").getAsString();
        // 解析成JSON数组
        JsonArray resultArray = gson.fromJson(resultStr, JsonArray.class);
        
        // 遍历使用数据
        resultArray.forEach(item -> {
            JsonObject orgObj = item.getAsJsonObject();
            System.out.println("组织名称(GE): " + orgObj.get("organizationNameGE").getAsString());
            System.out.println("优先级: " + orgObj.get("priority").getAsString());
        });
    }
}

关键注意点

  • 一定要做二次解析:先拿外层对象里的字符串,再把字符串转成数组,直接强转jsonObjectR.get("FinalResult")JSONArray会报错,因为它本质是字符串。
  • 确保你的JSON库依赖正确引入(比如json-simple的Maven依赖、Gson的依赖)。
  • $$hashKey是AngularJS生成的标识字段,不需要的话可以直接忽略,不影响解析。

内容的提问来源于stack exchange,提问作者Sagitarius

火山引擎 最新活动