Я пытаюсь зациклить массив вызовов: 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]

Если вы заметили, что список массивов вызовов не будет доступен во всех массивах JSON callSummary, он будет динамическим и может быть доступен в любом из перечисленных выше компонентов.

Поэтому я просто хочу динамически получать вызовы: массив JSON, итерацию и выборку сведений о машине.

Может ли кто-нибудь помочь мне в этом?

Примечание: я использую библиотеку JSON-Simple для анализа и итерации JSON. Было бы здорово, если бы я получил решение на том же.

Обновлено:

Я также попытался создать callSummary как массив JSON и зациклить этот массив для получения каждого объекта JSON и попытался найти вызовы, но это также приводит к нулевому указателю.

Также массив вызовов json не зависит от индекса. Это может быть где угодно в полезной нагрузке. Это может или не может быть там в полезной нагрузке. Мне просто нужно обработать, если он существует в каком-либо из компонентов, то мне нужно получить детали этого компьютера

0
ArrchanaMohan 19 Дек 2019 в 01:18

2 ответа

Вы должны соответствовать типам, указанным в вашей строке 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");
               }
           }
       }

Здесь вы также должны проверить значения JSON с помощью метода .has(...), чтобы избежать получения JSONException, если в вашем JSONObject поле не существует.

0
Christilyn 18 Дек 2019 в 22:49

Изменение JSONArray arrays=(JSONArray) getCalSummary.get("calls");
для
JSONArray arrays= getCalSummary.getJSONArray("calls") и все другие функции, где вы получаете объекты вместо «get», вы должны использовать «getJSONObject», «getString» и т. д., тогда вам не нужно приводить,

Также я уверен, что это не arrays.size() его arrays.length(), если вы используете пакет org.json.JSONArray, но так как ключ «звонки» не существует в каждом «callSummary», вы должны проверить, является ли он нулевым или нет ранее.

1
Herman Jansson 18 Дек 2019 в 22:34