Я получаю довольно глубокую строку объекта JSON из службы, которую я должен разобрать на объект JSON, а затем сопоставить его с классами.
Как преобразовать строку JSON в объект в Kotlin?
После этого сопоставление с соответствующими классами я использовал StdDeserializer из Jackson. Проблема возникает в тот момент, когда объект обладает свойствами, которые также должны быть десериализованы в классы. Мне не удалось получить объект mapper, по крайней мере, я не знал, как внутри другого десериализатора.
Спасибо за любую помощь. Предпочтительно, изначально я пытаюсь уменьшить количество зависимостей, которые мне нужны, поэтому, если ответ будет только для манипуляций JSON и разбора его, будет достаточно.
Нет сомнений в том, что будущее разбора в Котлине будет с kotlinx.serialization. Это часть библиотек Котлина. Это все еще на момент написания инкубатора.
https://github.com/Kotlin/kotlinx.serialization
Чтобы проанализировать это:
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)
В первую очередь.
Вы можете использовать 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"))
}
Я лично использую модуль 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Учитывая ваше описание, я считаю, что оно соответствует вашим потребностям.
Вы можете использовать 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)
http://www.jsonschema2pojo.org/ Привет, вы можете использовать этот сайт для преобразования json в pojo. control + Alt + shift + k
После этого вы можете вручную преобразовать этот класс модели в класс модели kotlin. с помощью вышеуказанного ярлыка.
Не уверен, что это то, что вам нужно, но это то, как я это сделал.
Использование 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»}}
Загрузите здесь источник дем (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()
}
})