尝试从 JSON 数组中获取对象值时观察到空指针
Null pointer observed while trying to fetch the object value from JSON array
我正在尝试循环调用: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]
如果您注意到调用 Array List 将不会在所有 callSummary JSON 数组中可用,并且它将是动态的并且可以在上面列出的任何组件下可用。
所以我只想动态获取调用:JSON 数组并迭代并获取机器详细信息。
有人可以帮我实现这个吗?
注意:我正在使用 JSON-Simple 库来解析和迭代 JSON。如果我能得到同样的解决方案那就太好了。
更新:
我还尝试将 callSummary 创建为 JSON 数组并循环该数组以获取每个 JSON 对象并尝试查找调用,但这也会导致空指针。
此外,调用 json 数组不是特定于索引的。它可以在有效载荷中的任何位置。它可能存在也可能不存在于有效载荷中。我只需要处理它是否存在于任何组件中,然后我需要获取该机器的详细信息
改变
JSONArray arrays=(JSONArray) getCalSummary.get("calls");
至
JSONArray arrays= getCalSummary.getJSONArray("calls")
以及所有其他获取对象而不是 "get" 的函数,您应该使用 "getJSONObject"、"getString" 等。那么您不必强制转换,
我也很确定它不是 arrays.size()
它 arrays.length()
如果你正在使用包 org.json.JSONArray
但是因为密钥 "calls" 不存在于每个 "callSummary" 你之前应该检查它是否为空。
您应该匹配 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 值,以避免在您的 JSONObject
中不存在某个字段时得到 JSONException
。
我正在尝试循环调用: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]
如果您注意到调用 Array List 将不会在所有 callSummary JSON 数组中可用,并且它将是动态的并且可以在上面列出的任何组件下可用。
所以我只想动态获取调用:JSON 数组并迭代并获取机器详细信息。
有人可以帮我实现这个吗?
注意:我正在使用 JSON-Simple 库来解析和迭代 JSON。如果我能得到同样的解决方案那就太好了。
更新:
我还尝试将 callSummary 创建为 JSON 数组并循环该数组以获取每个 JSON 对象并尝试查找调用,但这也会导致空指针。
此外,调用 json 数组不是特定于索引的。它可以在有效载荷中的任何位置。它可能存在也可能不存在于有效载荷中。我只需要处理它是否存在于任何组件中,然后我需要获取该机器的详细信息
改变
JSONArray arrays=(JSONArray) getCalSummary.get("calls");
至
JSONArray arrays= getCalSummary.getJSONArray("calls")
以及所有其他获取对象而不是 "get" 的函数,您应该使用 "getJSONObject"、"getString" 等。那么您不必强制转换,
我也很确定它不是 arrays.size()
它 arrays.length()
如果你正在使用包 org.json.JSONArray
但是因为密钥 "calls" 不存在于每个 "callSummary" 你之前应该检查它是否为空。
您应该匹配 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 值,以避免在您的 JSONObject
中不存在某个字段时得到 JSONException
。