How to create a JSONObject from String in Kotlin?
我需要将字符串
也许我误解了这个问题,但听起来您已经在使用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() |