开发者社区> 问答> 正文

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

我正在尝试循环调用:JSON数组,并尝试获取机器详细信息JSON对象,该对象存在于调用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"
               }
               ]
              }
            ]
    }
}

我将上述JSON文件存储在String变量中,并尝试获取正在调用的机器详细信息:通过使用以下代码,JSON ARRAY。

码:

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
           JSONObject getCalSummary = (JSONObject) object.get("callSummary");
           JSONArray arrays=(JSONArray) getCalSummary.get("calls");
           System.out.println(arrays.size()); // return null pointer
       }

错误:

java.lang.NullPointerException: null
        at com.online.amazon.hadoop.cal.swagger.utils.Utils.getHttpUrlformachineList(Utils.java:112) ~[classes/:na]

如果您注意到调用数组列表并非在所有callSummary JSON数组中都可用,并且它将是动态的,并且可以在上面列出的任何组件下使用。

所以我只想动态地获取调用:JSON数组并迭代和获取计算机详细信息。

有人可以帮助我实现这一目标吗?

注意:我正在使用JSON简单库来解析和迭代JSON。如果我能在同一方面找到解决方案,那就太好了。

更新:

我还尝试将callSummary创建为JSON数组并循环该数组以获取每个JSON对象,并尝试查找调用,但这也导致了Null指针。

同样,调用json数组不是特定于索引的。它可以在有效负载中的任何位置。有效载荷中可能存在也可能不存在。我只需要处理它是否存在于任何组件中,然后就需要获取该机器的详细信息

展开
收起
垚tutu 2019-12-19 17:03:19 1272 0
1 条回答
写回答
取消 提交回答
  • #include

    您应该匹配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");
                   }
               }
           }
    
    

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

    2019-12-19 17:03:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载