проверить, является ли JSON JSONObject или JSONArray в kotlin - PullRequest
0 голосов
/ 06 декабря 2018

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

{
  "result": {
    "response": {
      "data": [
        {
          "identification": {
            "id": null,
            "number": {
              "default": "IA224",
              "alternative": null
            },
            "callsign": null,
            "codeshare": null
          }
        }
      ]
    }
  }
}

, но иногда эти данные могут быть (объект JSON) или быть нулевыми, если я ввел неправильную информацию

data :  null

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

Caused by: org.json.JSONException: Value null of type org.json.JSONObject$1 cannot be converted to JSONArray

Я сделал этот код, но он не работает

val jsonArray = JSONArray(response.get("data").toString())

            if(jsonArray.isNull(0)){
               jsonArray.getJSONObject(0).getString("data");
            }

Ответы [ 2 ]

0 голосов
/ 02 августа 2019

Используйте приведенный ниже код, чтобы определить, является ли строка JSON JSONObject или JSONArray,

var json = JSONTokener(yourJSONString).nextValue()
when (json) {
    is JSONObject -> { //it is a JsonObject
    }
    is JSONArray -> { //it is a JsonArray
    }
    else -> { //handle the odd scenario
    }
}
0 голосов
/ 07 декабря 2018

Вы можете проверить с помощью оператора is , чтобы проверить, является ли объект JsonObject или JsonArray, как показано ниже

            val jsonObj = JSONObject(jsonString)

            if(jsonObj is JsonArray){
                  //handle operation with JsonArray
            }else if (jsonObj is JsonObject){
                  // treat this as JsonObject
            }

Вы также можете использовать , когда выражение в kotlin для проверкиэти условия, такие как

            when(jsonObj){
                is JsonObject -> { // treat this as JsonObject}
                is JsonArray -> { //treat this as JsonArray}
                else -> { //I have to find some other way to handle this}
            }

Обновление - Для вашего Json парсинг должен выполняться следующим образом

Создать pojo для следующего json скажем Xyz.kt

 {
  "identification": {
    "id": null,
    "number": {
      "default": "IA224",
      "alternative": null
    },
    "callsign": null,
    "codeshare": null
  }
}

    val resultJson = JSONObject(jsonString)
    val responseJson = resultJson.getJsonObject("response")
    val dataList = responseJson.getJsonArray("data")

Если вы каждый раз получаете одинаковую структуру для ответа Json, вам не нужно проверять, является ли dataList JsonArray или JsonObject.Вы можете просто перебрать dataList, чтобы получить список объектов Xyz или получить первый JsonElement (объект Xyz), используя метод get ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...