Проверка, является ли объект 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); // получаем весь JSON-поток
JSONArray interventionJsonArray = json.getJSONArray("intervention");
В первом случае данное решение не работает, так как в потоке только один элемент. Как мне проверить, является ли поток объектом или массивом?
Я пытался использовать json.length()
, но это не сработало.
Спасибо!
5 ответ(ов)
Что-то вроде этого должно сработать:
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
только один раз. Поскольку извлечение значения свойства требует обхода хеш-дерева или аналогичного, это полезно для производительности (если это важно).
Может, стоит сделать проверку в таком виде?
JSONObject intervention = json.optJSONObject("intervention");
Этот код вернет JSONObject
или null
, если объект "intervention" не является JSON-объектом. Далее, выполните следующее:
JSONArray interventions;
if(intervention == null)
interventions = json.optJSONArray("intervention");
Этот код вернет массив, если это корректный JSONArray
, или null
в противном случае.
Чтобы упростить задачу, вы можете просто проверить первый символ строки, полученной от сервера.
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"} ]
.
Вы можете получить объект из строки JSON, используя следующий код:
String data = "{ ... }";
Object json = new JSONTokener(data).nextValue();
if (json instanceof JSONObject) {
// обработка для JSONObject
} else if (json instanceof JSONArray) {
// обработка для JSONArray
}
Этот код позволяет определить, является ли представленный JSON-объект объектом JSONObject
или JSONArray
, и соответственно выполнить необходимые действия. Для получения более подробной информации вы можете обратиться к документации на официальном сайте Android.
В приведенном вами коде происходит обработка 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);
}
Если
valueObj
является объектомJSONObject
, вызывается методparseJSON
, который, предположительно, обрабатывает данные этого объекта.Если
valueObj
является массивомJSONArray
, вызывается методparseJSONArray
, который обрабатывает массив.Если ключ равен "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-объекты и массивы.
Если у вас есть дополнительные вопросы или нужен более подробный разбор, не стесняйтесь спрашивать!
Надеюсь, это поможет вам лучше понять логику представленного кода!
Как разобрать JSON в Java
Jackson с JSON: Неузнанное поле, не помеченное как проигнорируемое
Как преобразовать jsonString в JSONObject в Java?
Передача нескольких параметров в REST API - Spring
Jackson: Сериализация и десериализация значений enum в виде целых чисел