Deserialize JSON

282
22 сентября 2017, 18:29

Вот это JSON я разбирал так:

{"firstName":"Peter","lastName":"Noe"}
data class User(val firstName: String = "", val lastName: String = "") {
    class Deserializer : ResponseDeserializable<User> {
        override fun deserialize(content: String) = Gson().fromJson(content, User::class.java)!!
    }
}

Как разобрать этот? Мне нужно "distance -> value".

{
   "destination_addresses" : [
      "Пирятинская ул., 33, Абакан, Респ. Хакасия, Россия, 655011"
   ],
   "origin_addresses" : [
      "ул. Гагарина, 48-50, Абакан, Респ. Хакасия, Россия, 655002"
   ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "3,2 км",
                  "value" : 3182
               },
               "duration" : {
                  "text" : "8 мин.",
                  "value" : 501
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}

Старый вариант, но поможет ли он?

val resultJson = JSONObject(responseString)
val rows = resultJson.getJSONArray("rows")
val obj = rows.getJSONObject(0)
val elements = obj.getJSONArray("elements")
val element = elements.getJSONObject(0)
val distance = element.getJSONObject("distance")
var value = distance.getInt("value")
Answer 1

Зачем вы усложняете себе жизнь? За то время, которое вы пытаетесь разобраться с этим бедным json-ом, вы могли бы разобраться с Retrofit (вот пример туториала).

Тогда ваши десериализованные классы выглядели бы так:

data class Distance(var text: String, var value: Int)
data class Duration(var text: String, var value: Int)
data class Element(var distance: Distance, var duration: Duration, var status: String)
data class Row(var elements: List<Element>)   
data class Response(var destination_addresses: List<String>, var origin_addresses: List<String>, var rows: List<Row>, var status: String) 

С чего я это взял? В статье выше примерно описано как это делается на Java, для котлин это будет еще проще: копируете ваш json вот сюда, и просто делаете из этого дата-классы. Можно скопировать Java-код в котлин файл и подредактировать, но я и руками секунд за 30 справился.

Далее всё будет проще некуда:

// ... проводите все нужные действия, переписывать статью сюда я не буду
apiObject.methodName(param_0, param_1).enqueue(object : Callback<Response>) {
    override fun onResponse(call: Call<Response>, response: Response<Response>) {   
        // Здесь делаете всё, что вам нужно 
        val resp = response.body()
        val destination_addresses = resp.destination_addresses
        // и так далее
        // я мог немного ошибиться, подправьте сами, но суть такая
    }
    override fun onFailure(call: Call<Response>, t: Throwable) {
            // обрабатываем ошибку
    }
}
READ ALSO
Выгрузка из Java в Word

Выгрузка из Java в Word

У меня есть приложение на Java + HibernateМне надо формировать отчёты в ворде

238
Чтение KML файла в Java

Чтение KML файла в Java

Есть файл KML, при попытке его считать возникает ошибка при приведении объекта documentFeature класса Feature к типу Placemark, так как Placemark является дочерним...

341
generic-типы (java)

generic-типы (java)

Здравствуйте! Читаю о generic-ах, в качестве примера приводится класс Optional

208
Как использовать passphrase для RSAPrivateKey в java?

Как использовать passphrase для RSAPrivateKey в java?

При кодировании и декодировании я пользуюсь RSA ключами 2048Для дополнительной защищенности требуется использовать passphrase для RSAPrivateKey методом...

342