Как проверить, является ли данный объект объектом или массивом в строке JSON
Я получаю строку JSON с веб-сайта. У меня есть данные, которые выглядят как это (JSON Array)
myconf= {URL:[blah,blah]}
но иногда эти данные могут быть (объект JSON)
myconf= {URL:{try}}
также он может быть пустым
myconf= {}
Я хочу выполнять разные операции, когда его объект и разные, когда его массив. До сих пор в моем коде я пытался рассматривать только массивы, поэтому я получаю следующее исключение. Но я не могу проверить объекты или массивы.
Я получаю следующее исключение
org.json.JSONException: JSONObject["URL"] is not a JSONArray.
Может кто подскажет, как это можно исправить. Здесь я знаю, что объекты и массивы являются экземплярами объекта JSON. Но я не мог найти функцию, с помощью которой я могу проверить, является ли данный экземпляр массивом или объектом.
Я пробовал использовать это условие, но без успеха
if ( myconf.length() == 0 ||myconf.has("URL")!=true||myconf.getJSONArray("URL").length()==0)
Ответы
Ответ 1
Объекты JSON и массивы - это экземпляры JSONObject
и JSONArray
, соответственно. Добавьте к этому тот факт, что JSONObject
имеет метод get
, который вернет вам объект, вы можете проверить тип себя, не беспокоясь о ClassCastExceptions, и там вы идете.
if (!json.isNull("URL"))
{
// Note, not 'getJSONArray' or any of that.
// This will give us whatever at "URL", regardless of its type.
Object item = json.get("URL");
// 'instanceof' tells us whether the object can be cast to a specific type
if (item instanceof JSONArray)
{
// it an array
JSONArray urlArray = (JSONArray) item;
// do all kinds of JSONArray'ish things with urlArray
}
else
{
// if you know it either an array or an object, then it an object
JSONObject urlObject = (JSONObject) item;
// do objecty stuff with urlObject
}
}
else
{
// URL is null/undefined
// oh noes
}
Ответ 2
Довольно много способов.
Этот вариант менее рекомендуется, если вы обеспокоены проблемами системных ресурсов/неправильным использованием исключений Java для определения массива или объекта.
try{
// codes to get JSON object
} catch (JSONException e){
// codes to get JSON array
}
Или
Это рекомендуется.
if (json instanceof Array) {
// get JSON array
} else {
// get JSON object
}
Ответ 3
У меня тоже была такая же проблема. Тем не менее, я исправил это легко.
Мой json
был похож на:
[{"id":5,"excerpt":"excerpt here"}, {"id":6,"excerpt":"another excerpt"}]
Иногда я получаю ответ:
{"id":7, "excerpt":"excerpt here"}
Я тоже получаю ошибку, как ты. Сначала я должен был убедиться, что это JSONObject
или JSONArray
.
Массивы JSON покрыты [], а объекты - {}
Итак, я добавил этот код
if (response.startsWith("[")) {
//JSON Array
} else {
//JSON Object
}
Это сработало для меня, и я желаю, чтобы это было полезно и для вас, потому что это простой метод
Подробнее о String.startsс здесь - https://www.w3schools.com/java/ref_string_startswith.asp
Ответ 4
Используя ответ @Chao, я могу решить свою проблему. Другой способ также проверить это.
Это мой ответ Json
{
"message": "Club Details.",
"data": {
"main": [
{
"id": "47",
"name": "Pizza",
}
],
"description": "description not found",
"open_timings": "timings not found",
"services": [
{
"id": "1",
"name": "Free Parking",
"icon": "http:\/\/hoppyclub.com\/uploads\/services\/ic_free_parking.png"
}
]
}
}
Теперь вы можете проверить, что этот объект JSONObject
или JSONArray
в ответ.
String response = "above is my reponse";
if (response != null && constant.isJSONValid(response))
{
JSONObject jsonObject = new JSONObject(response);
JSONObject dataJson = jsonObject.getJSONObject("data");
Object description = dataJson.get("description");
if (description instanceof String)
{
Log.e(TAG, "Description is JSONObject...........");
}
else
{
Log.e(TAG, "Description is JSONArray...........");
}
}
Это используется для проверки того, что полученный json действителен или нет
public boolean isJSONValid(String test) {
try {
new JSONObject(test);
} catch (JSONException ex) {
// e.g. in case JSONArray is valid as well...
try {
new JSONArray(test);
} catch (JSONException ex1) {
return false;
}
}
return true;
}