如何在Kotlin中从String创建JSONObject?

时间:2017-05-31 22:31:14

标签: json kotlin

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

4 个答案:

答案 0 :(得分:14)

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

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")}")

结果:

Name : Cedric Beust, Age : 23

答案 1 :(得分:14)

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

答案 2 :(得分:9)

也许我误解了这个问题,但听起来你已经在使用org.json了解了为什么会这样做的问题

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

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

答案 3 :(得分:0)

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

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

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 -> put(key, value)
            is Number -> add(key, value)
            is String -> put(key, value)
            is JsonBuilder -> put(key, value.json)
            is Array<*> -> add(key, value)
            is JSONObject -> put(key, value)
            is JSONArray -> 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
}

fun toString() = json.toString()
}

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

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

JsonBuilder(       “名称”改为“艾米·怀恩豪斯”,       “年龄”到27    ).toString()

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

JsonBuilder(      “名称”改为“猫王”,      对JsonBuilder的“更多详细信息”(         JsonBuilder(“ GreatestHits”,arrayOf(“ Surrender”,“监狱摇滚”)),         从“类型”到“摇滚”,         “去世”到1977年)    ).toString()