关于json:如何从Kotlin中的String创建JSONObject?

How to create a JSONObject from String in Kotlin?

我需要将字符串{\\"name\\":\\"test name\\", \\"age\\":25}转换为JSONObject


也许我误解了这个问题,但听起来您已经在使用org.json,这引起了关于为什么的问题

1
val answer = JSONObject("""{"name":"test name","age":25}""")

会不是最好的方法吗? JSONObject的内置功能出了什么问题?


1
2
3
val rootObject= JSONObject()
rootObject.put("name","test name")
rootObject.put("age","25")


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

1
2
3
4
val parser: Parser = Parser()
val stringBuilder: StringBuilder = StringBuilder("{\"name\":\"Cedric Beust\", \"age\":23}")
val json: JsonObject = parser.parse(stringBuilder) as JsonObject
println("Name : ${json.string("name")}, Age : ${json.int("age")}")

结果:

1
Name : Cedric Beust, Age : 23


上面的方法有点危险:它们不能为非法字符提供解决方案。他们不逃避……我们讨厌自己逃避,不是吗?

这就是我所做的。不是那么可爱和干净,但是您只需要做一次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class JsonBuilder() {
    private var json = JSONObject()

    constructor(vararg pairs: Pair<String, *>) : this() {
        add(*pairs)
    }

    fun add(vararg pairs: Pair<String, *>) {
        for ((key, value) in pairs) {
            when (value) {
                is Boolean -> json.put(key, value)
                is Number -> add(key, value)
                is String -> json.put(key, value)
                is JsonBuilder -> json.put(key, value.json)
                is Array<*> -> add(key, value)
                is JSONObject -> json.put(key, value)
                is JSONArray -> json.put(key, value)
                else -> json.put(key, null) // Or whatever, on illegal input
            }
        }
    }

    fun add(key: String, value: Number): JsonBuilder {
        when (value) {
            is Int -> json.put(key, value)
            is Long -> json.put(key, value)
            is Float -> json.put(key, value)
            is Double -> json.put(key, value)
            else -> {} // Do what you do on error
        }

        return this
    }

    fun < T > add(key: String, items: Array< T >): JsonBuilder {
        val jsonArray = JSONArray()
        items.forEach {
            when (it) {
                is String,is Long,is Int, is Boolean -> jsonArray.put(it)
                is JsonBuilder -> jsonArray.put(it.json)
                else -> try {jsonArray.put(it)} catch (ignored:Exception) {/*handle the error*/}
            }
        }

        json.put(key, jsonArray)

        return this
    }

    override fun toString() = json.toString()
}

抱歉,可能不得不截断我的代码特有的类型,因此我可能已经破坏了一些东西-但想法应该很清楚

您可能已经知道,在Kotlin中," to"是一种将两个对象转换为Pair的infix方法。因此,您可以像这样简单地使用它:

1
2
3
4
   JsonBuilder(
     "name" to"Amy Winehouse",
     "age" to 27
   ).toString()

但是您可以做一些更可爱的事情:

1
2
3
4
5
6
7
JsonBuilder(
   "name" to"Elvis Presley",
   "furtherDetails" to JsonBuilder(
           "GreatestHits" to arrayOf("Surrender","Jailhouse rock"),
           "Genre" to"Rock",
           "Died" to 1977)
).toString()