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




