我从一个服务接收到一个相当深的JSON对象字符串,我必须解析为JSON对象,然后将其映射到类。

如何将JSON字符串转换为Kotlin对象?

在映射到各自的类之后,我使用了来自Jackson的StdDeserializer。当对象的属性也必须被反序列化为类时,问题就出现了。我无法在另一个反序列化器中获得对象映射器,至少我不知道如何获得。

最好是,在本地,我试图减少我需要的依赖项的数量,所以如果答案只是JSON操作和解析它就足够了。


当前回答

http://www.jsonschema2pojo.org/ 嗨,你可以使用这个网站将json转换为pojo。 控制+ Alt + shift + k

之后,您可以手动将该模型类转换为kotlin模型类。借助上述快捷方式。

其他回答

我创建了一个简单的扩展函数来将JSON字符串转换为模型类

inline fun <reified T: Any> String.toKotlinObject(): T =
    Gson().fromJson(this, T::class.java)

使用方法

stringJson.toKotlinObject<MyModelClass>()

这使用kotlinx。像以利沙的回答。与此同时,该项目已经过了1.0版本,因此API已经发生了变化。注意,例如JSON。parse被重命名为Json.decodeFromString。此外,从Kotlin 1.4.0开始,它以不同的方式导入gradle:

dependencies {
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0"
}
apply plugin: 'kotlinx-serialization'

使用示例:

import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
@Serializable
data class Point(val x: Int, val y: Int)

val pt = Json.decodeFromString<Point>("""{"y": 1, "x": 2}""")
val str = Json.encodeToString(pt)  // type can be inferred!

val ilist = Json.decodeFromString<List<Int>>("[-1, -2]")
val ptlist = Json.decodeFromString<List<Point>>(
    """[{"x": 3, "y": 4}, {"x": 5, "y": 6}]"""
)

你可以对可空字段和可选字段使用可空类型(T?):

@Serializable
data class Point2(val x: Int, val y: Int? = null)

val nlist = Json.decodeFromString<List<Point2>>(
    """[{"x": 7}, {"x": 8, "y": null}, {"x": 9, "y": 0}]"""
)

Kotlin的数据类是一个主要保存数据的类,并具有自动定义的成员. tostring()和其他方法(例如解构声明)。

您可以使用这个库https://github.com/cbeust/klaxon

Klaxon是一个轻量级库,用于在Kotlin中解析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的示例:

{“食品”: [{“食品名称”: “苹果”,“重量”: “110” } ]}

解析JSON字符串到Kotlin对象

正如其他人推荐的那样,Gson库是最简单的方法!

如果文件在资产文件夹中,您可以这样做,首先添加

dependencies {
  implementation 'com.google.code.gson:gson:2.9.0'
}

然后从资产中获取一个文件:

jsonString = context.assets.open(fileName).bufferedReader().use { it.readText() }

然后使用Gson:

val gson = Gson()
val listPersonType = object : TypeToken<List<Person>>() {}.type
var persons: List<Person> = gson.fromJson(jsonFileString, listPersonType)
persons.forEachIndexed { idx, person -> Log.i("data", "> Item $idx:\n$person") }

Person是一个模型/数据类,像这样

data class Person(val name: String, val age: Int, val messages: List) {
}