Как разобрать вложенный json в gson, используя класс данных kotlin [duplicate]

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

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

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

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

28
задан 30 January 2017 в 08:31

8 ответов

Нет сомнений в том, что будущее разбора в Котлине будет с kotlinx.serialization. Это часть библиотек Котлина. Это все еще на момент написания инкубатора.

https://github.com/Kotlin/kotlinx.serialization

9
ответ дан 15 August 2018 в 16:46

Без внешней библиотеки

Чтобы проанализировать это:

val parseMe = """
    {
       "type":"Foo",
       "data":[
          {
             "id":1,
             "title":"Hello"
          },
          {
             "id":2,
             "title":"World"
          }
       ]
    }        
"""

Используйте эти классы:

import org.json.JSONObject

class JSONFoos(json: String) : JSONObject(json) {
    val type: String? = this.optString("type")
    val data = this.optJSONArray("data")
            ?.let { 0.until(it.length()).map { i -> it.optJSONObject(i) } } // returns an array of JSONObject
            ?.map { JSONFoo(it.toString()) } // transforms each JSONObject of the array into JSONFoo
}

class JSONFoo(json: String) : JSONObject(json) {
    val id = this.optInt("id")
    val title: String? = this.optString("title")
}

Использование:

val foos = JSONFoos(parseMe)
2
ответ дан 15 August 2018 в 16:46

В первую очередь.

Вы можете использовать JSON для плагина преобразования класса Kotlin Data в Android Studio для сопоставления JSON на классы POJO (класс данных kotlin). Этот плагин будет аннотировать ваш класс данных Kotlin в соответствии с JSON.

Затем вы можете использовать конвертер GSON для преобразования JSON в Kotlin.

Следуйте этому полному руководству: Kotlin Android JSON Parsing Tutorial

Если вы хотите вручную разобрать json.

val **sampleJson** = """
  [
  {
   "userId": 1,
   "id": 1,
   "title": "sunt aut facere repellat provident occaecati excepturi optio 
    reprehenderit",
    "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita"
   }]
   """

Код для анализа над массивом JSON и его объектом с индексом 0.

var jsonArray = JSONArray(sampleJson)
for (jsonIndex in 0..(jsonArray.length() - 1)) {
Log.d("JSON", jsonArray.getJSONObject(jsonIndex).getString("title"))
}
0
ответ дан 15 August 2018 в 16:46

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

implementation "com.fasterxml.jackson.module:jackson-module-kotlin:$version"

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

Код kotlin: http://pastebin.com/iLY7hbhf (не отформатированный) json: http://filebin.ca/3B3reNQf3KXJ/rawSkilltree.json

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

6
ответ дан 15 August 2018 в 16:46

Вы можете использовать Gson.

Пример

Шаг 1

Добавить компиляцию

compile 'com.google.code.gson:gson:2.8.2'

Шаг 1

Преобразовать json в Kotlin Bean (использовать JsonToKotlinClass)

Подобно этим

Json данным

{
"timestamp": "2018-02-13 15:45:45",
"code": "OK",
"message": "user info",
"path": "/user/info",
"data": {
    "userId": 8,
    "avatar": "/uploads/image/20180115/1516009286213053126.jpeg",
    "nickname": "",
    "gender": 0,
    "birthday": 1525968000000,
    "age": 0,
    "province": "",
    "city": "",
    "district": "",
    "workStatus": "Student",
    "userType": 0
},
"errorDetail": null
}

Kotlin Bean

class MineUserEntity {

    data class MineUserInfo(
        val timestamp: String,
        val code: String,
        val message: String,
        val path: String,
        val data: Data,
        val errorDetail: Any
    )

    data class Data(
        val userId: Int,
        val avatar: String,
        val nickname: String,
        val gender: Int,
        val birthday: Long,
        val age: Int,
        val province: String,
        val city: String,
        val district: String,
        val workStatus: String,
        val userType: Int
    )
}

Шаг 3

Используйте Gson

var gson = Gson()
var mMineUserEntity = gson?.fromJson(response, MineUserEntity.MineUserInfo::class.java)
5
ответ дан 15 August 2018 в 16:46

http://www.jsonschema2pojo.org/ Привет, вы можете использовать этот сайт для преобразования json в pojo. control + Alt + shift + k

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

1
ответ дан 15 August 2018 в 16:46

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

Использование 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 : {«Еда»: {«FoodName»: «Яблоки», «Вес»: «110»}}

8
ответ дан 15 August 2018 в 16:46

Загрузите здесь источник дем (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()

        }

    })
-2
ответ дан 15 August 2018 в 16:46
  • 1
    он не просил клиента http, а просто для json parser ... – Willi Mentzel 2 January 2018 в 14:18

Другие вопросы по тегам:

Похожие вопросы: