如何在Kotlin中将JSON字符串解析为JSONObject?

20
我最近在Android Studio中用Kotlin开始了一个项目。
所以,我遇到了一个JSON对象的问题。我从一个BroadcastReceiver对象中获取数据,更具体地说,是以以下格式的字符串形式获取的:
{"s1":1}

这是一个简单的字符串。所以我用一个函数调用toJson并且这样做。
private fun toJson(data:String): JSONObject {
    
    var newData: String = data.replace("\"","")
    newData = newData.replace("{","")
    newData = newData.replace("}","")

    val newObject = newData.split(":")
    val name = newObject[0]
    val value = newObject[1]
    val rootObject = JSONObject()
    rootObject.put(name,value)

    return rootObject
}

我这样做对吗?我该如何改进我的代码?

1
我这样做是正确的吗?不,对于更复杂的数据来说这是不可行的。你可以尝试直接从字符串创建一个JSONObject。尝试使用JSONObject(data) - Tim
你应该查看这个线程。https://stackoverflow.com/questions/51777441/convert-stringified-json-to-jsonarray-using-kotlin-in-android - Hritik Gupta
如果其中一个答案对您有帮助,我建议您在投票下方将其标记为已接受。 - GV_FiQst
3个回答

26

欢迎来到StackOverflow!

在2019年,没有人会手动解析JSON。使用Gson库要容易得多。它以您的对象为输入,生成JSON字符串并反之亦然。

示例:

data class MyClass(@SerializedName("s1") val s1: Int)

val myClass: MyClass = Gson().fromJson(data, MyClass::class.java)
val outputJson: String = Gson().toJson(myClass)

这种方法不是直接使用JSON字符串,而是使用Kotlin对象进行类型安全和更方便的处理。

查看文档。文档相当详细且易于理解。

以下是一些教程:

更新:如果您确实想使用JSONObject,则可以使用带有字符串参数的构造函数自动解析您的JSON字符串。

val jsonObject = JSONObject(data)

谢谢,教程和更新部分非常有用! - Luippo
说实话,Gson 应该早就成为 Android 的一部分了。 - a_local_nobody
请参考以下链接了解Moshi(请参见https://dev59.com/BlcP5IYBdhLWcg3w8uhi和https://www.reddit.com/r/androiddev/comments/684flw/why_use_moshi_over_gson/dgx3gpm/)。 - Alexey Romanov
1
到了2022年,我仍然感到惊讶的是,我们不能直接在Kotlin中编写JSON,并支持一些DSL特性。(就像我们可以通过简单地使用“{}”在JS中创建对象一样) - Talha
对我来说,它编译成功了,但在执行时却出现了 java.lang.ClassNotFoundException: org.gradle.internal.impldep.com.google.gson.Gson 的错误。 - reducing activity
Gson位于com.google.gson包内。你的异常信息中的包名不同,所以我猜想你没有正确设置它。请参考官方文档。 - GV_FiQst

10

最好的方法是使用kotlinx.serialization库。通过对Kotlin对象进行标记并使用@Serializable注解,将其转换为JSON表示形式,并使用提供的Json对象上的encodeToStringdecodeFromString<T>扩展函数进行反向转换:

import kotlinx.serialization.*
import kotlinx.serialization.json.*
​
@Serializable
data class User(val name: String, val yearOfBirth: Int)
​
   // Serialization (Kotlin object to JSON string)val data = User("Louis", 1901)
   val string = Json.encodeToString(data)
   println(string) // {"name":"Louis","yearOfBirth":1901}// Deserialization (JSON string to Kotlin object)val obj = Json.decodeFromString<User>(string)
   println(obj) // User(name=Louis, yearOfBirth=1901)

更多例子: https://blog.jetbrains.com/kotlin/2020/10/kotlinx-serialization-1-0-released/

4
我在这里为Kotlin开发人员添加了三个模板,它可以解决JSON转换和解析问题。
//Json Array template
{
  "json_id": "12.4",
  "json_name": "name of the array",
  "json_image": "https://image_path",
  "json_description": "Description of the Json Array"
}

Kotlin模型类

data class JsonDataParser(
  @SerializedName("json_id") val id: Long, 
  @SerializedName("json_name") val name: String, 
  @SerializedName("json_image") val image: String,
  @SerializedName("json_description") val description: String
)

从模型类转换为Json字符串

val gson = Gson()
val json = gson.toJson(jsonDataParser)

从Json文件/流中解析
val json = getJson()
val topic = gson.fromJson(json, JsonDataParser::class.java)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接