Java 尝试从JSON数组获取对象值时观察到空指针

Java 尝试从JSON数组获取对象值时观察到空指针,java,arrays,json,spring,json-simple,Java,Arrays,Json,Spring,Json Simple,我正在尝试循环calls:JSON数组,并尝试获取calls JSON数组列表下的machine details JSON对象,如下所示: { "<dynamicValue>":{ "type":"CORR-ID", "tags":[ { "name":"9VB6454145983212H", "flags":[ "FLAG_DYNAMIC_VALUE",

我正在尝试循环calls:JSON数组,并尝试获取calls JSON数组列表下的machine details JSON对象,如下所示:

{
   "<dynamicValue>":{
      "type":"CORR-ID",
      "tags":[
         {
            "name":"9VB6454145983212H",
            "flags":[
               "FLAG_DYNAMIC_VALUE",
               "FLAG_ID_LOOKUP_SUPPORTED"
            ]
         }
      ],
      "callSummary":[
         {
            "colo":"lvs",
            "pool":"amazon_paymentsplatformserv",
            "machine":"stage2utb29958"
         },
         {
            "colo":"lvs",
            "pool":"amazon_elmoserv",
            "machine":"msmamoserv_0"

         },
         {
            "colo":"lvs",
            "pool":"amazon_xopaymentgatewayserv",
            "machine":"msmastmentgatewayserv_1"
         },
         {
            "colo":"lvs",
            "pool":"amazon_paymentapiplatserv",
            "machine":"msmaentapiplatserv_2"
         },
         {
            "colo":"lvs",
            "pool":"amazon_userlifecycleserv_ca",
            "machine":"stage2utb91581"
         },
         {
            "colo":"lvs",
            "pool":"amazon_dafproxyserv",
            "machine":"msmasfproxyserv_1"
         },
         {
            "colo":"lvs",
            "pool":"paymentserv",
            "machine":"te-alm-15757_paymentexecutionserv_0",
            "calls":[
               {
                  "colo":"lvs",
                  "pool":"fimanagementserv_ca",
                  "machine":"msmgementserv_ca_20"
               },
               {
                  "colo":"lvs",
                  "pool":"fimanagementserv_ca",
                  "machine":"msmasgementserv_ca_4"
               }
               ]
              }
            ]
    }
}
如果您注意到calls数组列表在所有callSummary JSON数组中都不可用,它将是动态的,并且可以在上面列出的任何组件下使用

所以我只想动态地获取调用:JSON数组和迭代并获取机器细节

有人能帮我做到这一点吗

注意:我使用JSON简单库来解析和迭代JSON。如果我能得到同样的解决方案,那就太好了

更新:

    java.lang.NullPointerException: null
        at com.online.amazon.hadoop.cal.swagger.utils.Utils.getHttpUrlformachineList(Utils.java:112) ~[classes/:na]
我还尝试将callSummary创建为JSON数组,并循环该数组以获取每个JSON对象,并尝试查找调用,但这也会导致空指针

此外,调用json数组不是特定于索引的。它可以在有效载荷中的任何位置。它可能在有效载荷中,也可能不在有效载荷中。我只需要处理它是否存在于任何组件中,然后我需要获取该机器的详细信息
JSONArray数组=(JSONArray)getCalSummary.get(“调用”)

JSONArray数组=getCalSummary.getJSONArray(“调用”)
以及所有其他获取对象而不是“get”的函数,您应该使用“getJSONObject”、“getString”等。。那你就不必投了


另外,如果您使用的是package
org.json.JSONArray
,我很确定它不是
arrays.size()
its
arrays.length()
,但是因为键“calls”并不存在于每个“callSummary”中,所以您应该检查它之前是否为null

您应该匹配JSON字符串中指定的类型:

 public static void getHttpUrlformachineList(String response, String CalId, String componentName)
            throws Exception
      {
           //System.out.println(response);
           Map<String, String> data = new HashMap<String, String>();
           JSONParser parser = new JSONParser();
           JSONObject object = (JSONObject) parser.parse(response);
           JSONObject getValue = (JSONObject) object.get(CalId.trim()); //CalId is the dynamic value that mentioned in the JSON input file
           JSONArray getCalSummary = (JSONArray) object.get("callSummary"); // callSummary is a JSONArray, not JSONObject
           for (int i = 0; i < getCalSummary.length(); i++) {
               JSONObject obj = getCalSummary.getJSONObject(i);
               if (obj.has("calls")) {
                   // grab calls array:
                   JSONArray callsArray = obj.getJSONArray("calls");
               }
           }
       }
publicstaticvoid getHttpUrlformachineList(字符串响应、字符串CalId、字符串组件名)
抛出异常
{
//System.out.println(响应);
映射数据=新的HashMap();
JSONParser=新的JSONParser();
JSONObject object=(JSONObject)parser.parse(response);
JSONObject getValue=(JSONObject)object.get(CalId.trim());//CalId是JSON输入文件中提到的动态值
JSONArray getCalSummary=(JSONArray)object.get(“callSummary”);//callSummary是一个JSONArray,而不是JSONObject
对于(int i=0;i

在这里,您还应该使用
.has(…)
方法检查JSON值,以避免在
JSONObject
中不存在字段的情况下获取
JSONException

调用摘要为
JSONArray
类型而非
JSONObject
。您的
调用
数组似乎只存在于
调用摘要
的最后一个元素中。我尝试将调用摘要创建为JSONArray和循环,并尝试获取每个JSON对象,但没有成功。调用数组将在该有效负载中的任何位置可用。这是样品。调用数组不是基于索引的。我只给出了一个示例。在json简单库中找不到getJSONObject()。@ArrchanaMohan如果是这样的话。您可以将其强制转换为
JSONObject
,就像您在前面的部分中所做的那样。请添加以下行并检查结果:JSONObject getName=(JSONObject)getCalSummary.get(i);{if(getName.get(“calls”)!=null){JSONArray数组=(JSONArray)getName.get(“calls”);System.out.println(arrays.size();}}如果可能,您应该使用
has(…)
方法:
getName.has(“calls”)
检查JSONObject是否包含名为
calls
的字段。我已经编辑了我的答案来解释这个变化。因为如果在一个不存在的字段上调用
get
方法,就可以得到一个
JSONException
。因此,最好使用内置方法
具有(…)
以上代码现在可以正常工作了。。。当然,我也会实施同样的措施。。非常感谢你的帮助和耐心。
 public static void getHttpUrlformachineList(String response, String CalId, String componentName)
            throws Exception
      {
           //System.out.println(response);
           Map<String, String> data = new HashMap<String, String>();
           JSONParser parser = new JSONParser();
           JSONObject object = (JSONObject) parser.parse(response);
           JSONObject getValue = (JSONObject) object.get(CalId.trim()); //CalId is the dynamic value that mentioned in the JSON input file
           JSONArray getCalSummary = (JSONArray) object.get("callSummary"); // callSummary is a JSONArray, not JSONObject
           for (int i = 0; i < getCalSummary.length(); i++) {
               JSONObject obj = getCalSummary.getJSONObject(i);
               if (obj.has("calls")) {
                   // grab calls array:
                   JSONArray callsArray = obj.getJSONArray("calls");
               }
           }
       }