Подтвердить что ты не робот

Проверьте, является ли это JSONObject или JSONArray

У меня есть поток json, который может быть чем-то вроде:

{"intervention":

    { 
      "id":"3",
              "subject":"dddd",
              "details":"dddd",
              "beginDate":"2012-03-08T00:00:00+01:00",
              "endDate":"2012-03-18T00:00:00+01:00",
              "campus":
                       { 
                         "id":"2",
                         "name":"paris"
                       }
    }
}

или что-то вроде

{"intervention":
            [{
              "id":"1",
              "subject":"android",
              "details":"test",
              "beginDate":"2012-03-26T00:00:00+02:00",
              "endDate":"2012-04-09T00:00:00+02:00",
              "campus":{
                        "id":"1",
                        "name":"lille"
                       }
            },

    {
     "id":"2",
             "subject":"lozlzozlo",
             "details":"xxx",
             "beginDate":"2012-03-14T00:00:00+01:00",
             "endDate":"2012-03-18T00:00:00+01:00",
             "campus":{
                       "id":"1",
                       "name":"lille"
                      }
            }]
}   

В моем коде Java я делаю следующее:

JSONObject json = RestManager.getJSONfromURL(myuri); // retrieve the entire json stream     
JSONArray  interventionJsonArray = json.getJSONArray("intervention");

В первом случае вышеуказанное не работает, потому что в потоке есть только один элемент. Как проверить, является ли поток object или array?

Я пробовал с json.length(), но это не сработало.

Спасибо

4b9b3361

Ответ 1

Что-то вроде этого должно это сделать:

JSONObject json;
Object     intervention;
JSONArray  interventionJsonArray;
JSONObject interventionObject;

json = RestManager.getJSONfromURL(myuri); // retrieve the entire json stream     
Object intervention = json.get("intervention");
if (intervention instanceof JSONArray) {
    // It an array
    interventionJsonArray = (JSONArray)intervention;
}
else if (intervention instanceof JSONObject) {
    // It an object
    interventionObject = (JSONObject)intervention;
}
else {
    // It something else, like a string or number
}

Это имеет то преимущество, что сразу же получает значение свойства из основного JSONObject. Поскольку получение ценности свойства включает в себя хождение с деревом хэшей или аналогичным, что полезно для производительности (для чего это стоит).

Ответ 2

Может быть, проверка вроде этого?

JSONObject intervention = json.optJSONObject("intervention");

Это возвращает a JSONObject или null, если объект вмешательства не является объектом json. Затем выполните следующее:

JSONArray interventions;
if(intervention == null)
        interventions=jsonObject.optJSONArray("intervention");

Это вернет вам массив, если его действительный JSONArray, иначе он даст null

Ответ 3

Чтобы сделать его простым, вы можете просто проверить первую строку из результата сервера.

String result = EntityUtils.toString(httpResponse.getEntity()); //this function produce JSON
String firstChar = String.valueOf(result.charAt(0));

if (firstChar.equalsIgnoreCase("[")) {
    //json array
}else{
    //json object
}

Этот трюк основан только на строках формата JSON {foo : "bar"} (object) или [ {foo : "bar"}, {foo: "bar2"} ] (массив)

Ответ 4

Я не пробовал, но, может быть...


JsonObject jRoot = RestManager.getJSONfromURL(myuri); // retrieve the entire json stream
JsonElement interventionElement = jRoot.get("intervention");
JsonArray interventionList = new JsonArray();

if(interventionElement.isJsonArray()) interventionList.addAll(interventionElement.getAsJsonArray());
else interventionList.add(interventionElement);

Если это объект JsonArray, просто используйте getAsJsonArray() для его создания. Если нет, это один элемент, поэтому просто добавьте его.

Во всяком случае, ваш первый пример нарушен, вы должны попросить владельца сервера исправить его. Структура данных JSON должна быть последовательной. Это не только потому, что иногда вмешательство приходит только с одним элементом, что ему не нужно быть массивом. Если он имеет только 1 элемент, он будет массивом только из 1 элемента, но все равно должен быть массивом, так что клиенты могут анализировать его, используя всегда одну и ту же схему.

Ответ 5

    //returns boolean as true if it is JSONObject else returns boolean false 
public static boolean returnBooleanBasedOnJsonObject(Object jsonVal){
        boolean h = false;
        try {
            JSONObject j1=(JSONObject)jsonVal;
            h=true;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
   if(e.toString().contains("org.json.simple.JSONArray cannot be cast to     org.json.simple.JSONObject")){
                h=false;
            }
        }
        return h;

    }