web-dev-qa-db-ja.com

KotlinでStringからJSONObjectを作成する方法は?

文字列{\"name\":\"test name\", \"age\":25}をJSONObjectに変換する必要があります

27
nkukday

おそらく私は質問を誤解しているかもしれませんが、あなたはすでにorg.jsonを使用しているように聞こえます。

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

それを行うための最良の方法ではないでしょうか? JSONObjectの組み込み機能の何が問題になっていますか?

15
Ryba

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
14
Akshar Patel
val rootObject= JSONObject()
rootObject.put("name","test name")
rootObject.put("age","25")
14
arjun shrestha

上記のアプローチは少し危険です。違法なチャーに対する解決策を提供しません。彼らはエスケープを行いません。そして、我々は自分でエスケープすることを嫌いますよね?

だからここに私がやったことだ。かわいくてきれいではありませんが、一度だけやらなければなりません。

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」は2つのオブジェクトをペアに変換する中置メソッドであることをご存知かもしれません。したがって、次のように単純に使用します。

JsonBuilder( "name"から "Amy Winehouse"、 "age"から27).toString()

しかし、もっとかわいいことができます:

JsonBuilder( "name"から "Elvis Presley"、 "furtherDetails"からJsonBuilder(JsonBuilder( "GreatestHits"、arrayOf( "Surrender"、 "Jailhouse rock"))、 "ジャンル"から "Rock"、 "死亡"から1977) ).toString()

0
Maneki Neko