我正在努力从JSON对象中读取一些值,这些值是在我点击REST API时得到的。.
我的目标:我需要遍历数据对象数组中的每组数据,检查TRAN_ID的值并采取相应的措施。
下面是数据格式
{
"data": [
{
"CUST_ID": "CUST7",
"EXPRY_DATE": null,
"PARAMS": "[{TRAN_IND:savings},{TRAN_TYP:Debit},{country:US}]"
},
{
"CUST_ID": "CUST8",
"EXPRY_DATE": null,
"PARAMS": "[{TRAN_IND:current},{TRAN_TYP:Debit},{country:US}]"
}
]
}
这看起来很简单,我在互联网上尝试了多种解决方案,但我不知道它对我不起作用,并且在读取“ PARAMS”并将其转换为JSONArray进行进一步处理时出现错误提示
线程“ main”中的异常java.lang.ClassCastException:java.lang.String无法转换为org.json.simple.JSONArray
我尝试过的事情:
private static void jsonParser(String jsonStr) throws ParseException {
JSONObject data= (JSONObject)JSONValue.parse(jsonStr );
JSONArray jsonObj = (JSONArray)data.get("data");
JSONObject JsonRow = (JSONObject)jsonObj.get(0);
JSONArray servParam= (JSONArray) JsonRow.get("PARAMS");
String tran_ind=(String) servParam.get(0);
System.out.println( tran_ind);
}
答案 0 :(得分:2)
我猜这就是你在干什么?
try{
JSONObject obj = new JSONObject(sample);
JSONArray data = obj.getJSONArray("data");
for(int i=0; i<data.length(); i++){
JSONObject detail = data.getJSONObject(i);
detail.getString("CUST_ID"); //here is the customer id
detail.getString("EXPRY_DATE"); //here is the exp date
JSONArray params = detail.getJSONArray("PARAMS");
for(int j=0; j<params.length(); j++){
// {TRAN_IND:current},{TRAN_TYP:Debit},{country:US}
JSONObject res = params.getJSONObject(j);
String tran_ind = res.toString();
String tran_type = res.toString();
String country = res.toString();
out.println(tran_ind + " " +tran_type + " " + country);
}
}
}catch (JSONException ex){
ex.printStackTrace();
}
答案 1 :(得分:1)
线程“ main”中的异常java.lang.ClassCastException:java.lang.String无法转换为org.json.simple.JSONArray
=>因为您正尝试通过代码将String
值"[{TRAN_IND:savings},{TRAN_TYP:Debit},{country:US}]"
解析到JsonArray中,所以:
JSONArray servParam= (JSONArray) JsonRow.get("PARAMS");
答案 2 :(得分:0)
实际上,参数似乎是一个字符串。
不要编写自己的解析器。如果您只需要在数组的每个元素中读取该字符串,我只需将整个JSON转换为带有Jackson的Map:
HashMap<String,Object> parsed =
new ObjectMapper().readValue(JSON_SOURCE, HashMap.class);
,然后遍历“数据”元素(这将是地图列表)。
List<Map> data = (List) parsed.get("data");
答案 3 :(得分:0)
真正的问题是这些不是嵌套的JSON字符串。那是
"PARAMS": "[{\"TRAN_IND\":\"current\"},{\"TRAN_TYP\":\"Debit\"},{\"country\":\"US\"}]"
因此“文本”部分在内部被"
-s包围(必须转为\"
-s)。
在这种情况下,您可以写
String json=
"{\n"+
" \"data\": [\n"+
" {\n"+
" \"CUST_ID\": \"CUST7\",\n"+
" \"EXPRY_DATE\": null,\n"+
" \"PARAMS\": \"[{\\\"TRAN_IND\\\":\\\"savings\\\"},{\\\"TRAN_TYP\\\":\\\"Debit\\\"},{\\\"country\\\":\\\"US\\\"}]\"\n"+
" },\n"+
" {\n"+
" \"CUST_ID\": \"CUST8\",\n"+
" \"EXPRY_DATE\": null,\n"+
" \"PARAMS\": \"[{\\\"TRAN_IND\\\":\\\"current\\\"},{\\\"TRAN_TYP\\\":\\\"Debit\\\"},{\\\"country\\\":\\\"US\\\"}]\"\n"+
" }\n"+
" ]\n"+
"}";
// Print input for clarity:
System.out.println(json);
JSONObject data= (JSONObject)JSONValue.parse(json);
JSONArray jsonObj = (JSONArray)data.get("data");
JSONObject JsonRow = (JSONObject)jsonObj.get(0);
// parse nested JSON
JSONArray servParam= (JSONArray)JSONValue.parse((String)JsonRow.get("PARAMS"));
// array element is an object ({"TRAN_IND":"savings"}), so toString has to be used:
String tran_ind=servParam.get(0).toString();
System.out.println(tran_ind);
(之所以有反斜杠堆,是因为必须在源代码中转义双引号,以及建议的转义双引号。因此它们不会出现在JSON文件中。尝试运行中的代码,它会打印JSON它可以工作)
因此(JSONArray)JSONValue.parse((String)JsonRow.get("PARAMS"))
将获取并解析嵌套的JSON。
但是现在您要么需要重新整理生成输入的代码,要么手动解析嵌套的非JSON。
答案 4 :(得分:0)
您可以使用以下代码进行解析。
String servParam = (String) JsonRow.get("PARAMS");
String servParamSplitted[] = servParam.substring(1, servParam.length() - 1).split(",");
String traind_id[] = servParamSplitted[0].substring(1, servParamSplitted[0].length() - 1).split(":");
String train_id=traind_id[1];
我想补充一点,您的JSON应该类似于以下格式。
{
"data": [
{
"CUST_ID": "CUST7",
"EXPRY_DATE": null,
"PARAMS": [{"TRAN_IND":"savings"},{"TRAN_TYP":"Debit"},{"country":"US"}]
},
{
"CUST_ID": "CUST8",
"EXPRY_DATE": null,
"PARAMS": [{"TRAN_IND":"current"},{"TRAN_TYP":"Debit"},{"country":"US"}]
}
]
}
因此,我们可以使用以下代码对其进行解析。
JSONArray servParam = (JSONArray) JsonRow.get("PARAMS");
JSONObject jsonObjectTrainID = (JSONObject) servParam.get(0);
String TrainIDValue = (String) jsonObjectTrainID.get("TRAN_IND");