使用Java从嵌套的JSON对象读取数据

时间:2018-10-29 14:41:24

标签: java json

我正在努力从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);
}

5 个答案:

答案 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");