Как проверить, является ли данный объект объектом или массивом в строке JSON - PullRequest
14 голосов
/ 22 марта 2012

Я получаю строку JSON с веб-сайта.У меня есть данные, которые выглядят так (массив JSON)

 myconf= {URL:[blah,blah]}

, но иногда эти данные могут быть (объект JSON)

 myconf= {URL:{try}}

и могут быть пустыми

 myconf= {}    

Я хочу делать разные операции, когда его объект и разные, когда это массив.До сих пор в своем коде я пытался рассматривать только массивы, поэтому я получаю следующее исключение.Но я не могу проверить наличие объектов или массивов.

Я получаю следующее исключение

    org.json.JSONException: JSONObject["URL"] is not a JSONArray.

Может кто-нибудь подсказать, как это можно исправить.Здесь я знаю, что объекты и массивы являются экземплярами объекта JSON.Но я не смог найти функцию, с помощью которой я мог бы проверить, является ли данный экземпляр массивом или объектом.

Я пытался использовать это условие if, но безуспешно

if ( myconf.length() == 0 ||myconf.has("URL")!=true||myconf.getJSONArray("URL").length()==0)

Ответы [ 4 ]

32 голосов
/ 22 марта 2012

Объекты и массивы JSON являются экземплярами JSONObject и JSONArray соответственно.Добавьте к этому тот факт, что JSONObject имеет метод get, который вернет вам объект, вы можете проверить тип себя, не беспокоясь о ClassCastExceptions, и все готово.

if (!json.isNull("URL"))
{
    // Note, not `getJSONArray` or any of that.
    // This will give us whatever's 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's an array
        JSONArray urlArray = (JSONArray) item;
        // do all kinds of JSONArray'ish things with urlArray
    }
    else
    {
        // if you know it's either an array or an object, then it's an object
        JSONObject urlObject = (JSONObject) item;
        // do objecty stuff with urlObject
    }
}
else
{
    // URL is null/undefined
    // oh noes
}
7 голосов
/ 22 марта 2012

Довольно много способов.

Этот вариант менее рекомендуется, если вы обеспокоены проблемами системных ресурсов / неправильным использованием исключений 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
}
1 голос
/ 24 мая 2018

У меня тоже была такая же проблема. Хотя я исправил это легко.

Мой json был похож на:

[{"id":5,"excerpt":"excerpt here"}, {"id":6,"excerpt":"another excerpt"}]

Иногда я получаю ответ вроде:

{"id":7, "excerpt":"excerpt here"}

Я тоже получал ошибку, как ты. Сначала я должен был убедиться, что это JSONObject или JSONArray.

Массивы JSON покрыты [], а объекты с {}

Итак, я добавил этот код

if(response.startWith("[")){
  //JSON Array
}else{
  //JSON Object
}

Это сработало для меня, и я хотел бы, чтобы оно также было полезным для вас, потому что это просто простой метод

0 голосов
/ 07 января 2017

Используя ответ @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;
    }
...