Как разбирать JSON в Котлине?

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

Как преобразовать строку JSON в объект в Котлин?

После этого сопоставление с соответствующими классами я использовал StdDeserializer из Jackson. Проблема возникает в тот момент, когда объект обладает свойствами, которые также должны быть десериализованы в классы. Мне не удалось получить объект mapper, по крайней мере, я не знал, как внутри другого десериализатора.

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

Вы можете использовать эту библиотеку https://github.com/cbeust/klaxon

Klaxon – легкая библиотека для разбора JSON в Котлине.

Не уверен, что это то, что вам нужно, но это то, как я это сделал.

Использование import org.json.JSONObject:

val jsonObj = JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1)) val foodJson = jsonObj.getJSONArray("Foods") for (i in 0..foodJson!!.length() - 1) { val categories = FoodCategoryObject() val name = foodJson.getJSONObject(i).getString("FoodName") categories.name = name } 

Вот пример json: {«Foods»: {«FoodName»: «Яблоки», «Вес»: «110»}}

Я лично использую модуль jackson для kotlin, который вы можете найти здесь: github.com/FasterXML/jackson-module-kotlin.

В качестве примера, здесь приведен код для анализа json пути Exile skilltree, который довольно тяжелый (84k строк при форматировании):

Учитывая ваше описание, я считаю, что он соответствует вашим потребностям.

Загрузите источник дема отсюда ( Json parsing in android kotlin )

Добавьте эту зависимость:

 compile 'com.squareup.okhttp3:okhttp:3.8.1' 

Вызов функции api:

  fun run(url: String) { dialog.show() val request = Request.Builder() .url(url) .build() client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { dialog.dismiss() } override fun onResponse(call: Call, response: Response) { var str_response = response.body()!!.string() val json_contact:JSONObject = JSONObject(str_response) var jsonarray_contacts:JSONArray= json_contact.getJSONArray("contacts") var i:Int = 0 var size:Int = jsonarray_contacts.length() al_details= ArrayList(); for (i in 0.. size-1) { var json_objectdetail:JSONObject=jsonarray_contacts.getJSONObject(i) var model:Model= Model(); model.id=json_objectdetail.getString("id") model.name=json_objectdetail.getString("name") model.email=json_objectdetail.getString("email") model.address=json_objectdetail.getString("address") model.gender=json_objectdetail.getString("gender") al_details.add(model) } runOnUiThread { //stuff that updates ui val obj_adapter : CustomAdapter obj_adapter = CustomAdapter(applicationContext,al_details) lv_details.adapter=obj_adapter } dialog.dismiss() } })