0

Проверка, является ли объект JSONObject или JSONArray

12

У меня есть 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); // получаем весь JSON-поток     
JSONArray interventionJsonArray = json.getJSONArray("intervention");

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

Я пытался использовать json.length(), но это не сработало.

Спасибо!

5 ответ(ов)

1

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

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

json = RestManager.getJSONfromURL(myuri); // получаем весь json поток     
Object intervention = json.get("intervention");
if (intervention instanceof JSONArray) {
    // Это массив
    interventionJsonArray = (JSONArray)intervention;
}
else if (intervention instanceof JSONObject) {
    // Это объект
    interventionObject = (JSONObject)intervention;
}
else {
    // Это что-то другое, например, строка или число
}

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

0

Может, стоит сделать проверку в таком виде?

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

Этот код вернет JSONObject или null, если объект "intervention" не является JSON-объектом. Далее, выполните следующее:

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

Этот код вернет массив, если это корректный JSONArray, или null в противном случае.

0

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

String result = EntityUtils.toString(httpResponse.getEntity()); // эта функция возвращает JSON
String firstChar = String.valueOf(result.charAt(0));

if (firstChar.equalsIgnoreCase("[")) {
    // JSON массив
} else {
    // JSON объект
}

Этот способ основан на формате JSON: если строка начинается с {, то это объект, например {foo : "bar"}, а если с [, то это массив, например [ {foo : "bar"}, {foo: "bar2"} ].

0

Вы можете получить объект из строки JSON, используя следующий код:

String data = "{ ... }";
Object json = new JSONTokener(data).nextValue();
if (json instanceof JSONObject) {
    // обработка для JSONObject
} else if (json instanceof JSONArray) {
    // обработка для JSONArray
}

Этот код позволяет определить, является ли представленный JSON-объект объектом JSONObject или JSONArray, и соответственно выполнить необходимые действия. Для получения более подробной информации вы можете обратиться к документации на официальном сайте Android.

0

В приведенном вами коде происходит обработка JSON-объектов и массивов. Вот перевод на русский в стиле ответа на StackOverflow:


В данном фрагменте кода происходит извлечение значения по ключу из объекта uiJSON.

Object valueObj = uiJSON.get(keyValue);

После этого код проверяет, является ли извлеченное значение объектом типа JSONObject, JSONArray или строкой с ключом "type".

if (valueObj instanceof JSONObject) {
    this.parseJSON((JSONObject) valueObj);
} else if (valueObj instanceof JSONArray) {
    this.parseJSONArray((JSONArray) valueObj);
} else if(keyValue.equalsIgnoreCase("type")) {
    this.addFlagKey((String) valueObj);
}
  1. Если valueObj является объектом JSONObject, вызывается метод parseJSON, который, предположительно, обрабатывает данные этого объекта.

  2. Если valueObj является массивом JSONArray, вызывается метод parseJSONArray, который обрабатывает массив.

  3. Если ключ равен "type" (независимо от регистра), вызывается метод addFlagKey, который, скорее всего, добавляет какой-то флаг или значение.

Метод parseJSONArray реализован следующим образом:

private void parseJSONArray(JSONArray jsonArray) throws JSONException {
    for (Iterator iterator = jsonArray.iterator(); iterator.hasNext();) {
        JSONObject object = (JSONObject) iterator.next();
        this.parseJSON(object);
    }
}

Здесь происходит итерация по элементам массива jsonArray, и для каждого элемента (который должен быть объектом JSONObject) вызывается метод parseJSON для дальнейшей обработки. Этот подход позволяет рекурсивно обрабатывать вложенные JSON-объекты и массивы.

Если у вас есть дополнительные вопросы или нужен более подробный разбор, не стесняйтесь спрашивать!


Надеюсь, это поможет вам лучше понять логику представленного кода!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь