繁体   English   中英

在没有库的情况下转换为 JSONObject 并返回 Kotlin

[英]Converting to JSONObject and back in Kotlin without Library

我正在尝试将嵌套的 Map 转换为 JSONObject,如下所示:

    fun convertToJson(input: Map<String, Any>): JSONObject {
        val jsonObject = JSONObject()
        input.forEach { (key, value) ->
            if (value is Map<*, *>) {
                val iterator = value.entries.iterator()
                while (iterator.hasNext()) {
                    val pairs = iterator.next()
                    (pairs.key as? String)?.let { k ->
                        pairs.value?.let { v ->
                            jsonObject.put(k, v)
                        }
                    }
                }
            }
            jsonObject.put(key, value)
        }
        return jsonObject
    }

(我尝试按照这个示例将 HashMap<String, object> 放入 jsonobject

我这样称呼它

val input = mapOf(
  "key1" to mapOf("inner_key1" to "foo"))
val output = convertToJson(input)

我不明白的是为什么

output.optJSONObject("key1") null? 据我了解, output.opt("key1")返回Map<*, *>

这就是我所得到的。 我不确定我的convertToJson是否需要修复,或者我的理解是否需要更正,因为optJSONObject不应该用于嵌套类型,如果我知道类型将是Map ,我应该使用opt

尝试将JSONObject放入JSONObject而不是Map<*, *>

fun convertToJson(input: Map<String, Any>): JSONObject {
    val jsonObject = JSONObject()
    input.forEach { (key, value) ->
        if (value is Map<*, *>) {
            val iterator = value.entries.iterator()
            val childObject = JSONObject()
            while (iterator.hasNext()) {
                val pairs = iterator.next()
                (pairs.key as? String)?.let { k ->
                    pairs.value?.let { v ->
                        childObject.put(k, v)
                    }
                }
            }

            jsonObject.put(key, childObject)
        } else {
            jsonObject.put(key, value)
        }
    }
    return jsonObject
}

您的代码中的逻辑不会将Map的键放入嵌套的 object 中,而是直接放入jsonObject中。 然后它甚至为Map也调用jsonObject.put(key, value) (我有点惊讶它没有抛出异常,因为它不是允许的类型之一:

Object: a JSONObject, JSONArray, String, Boolean, Integer, Long, Double, NULL, or null. 可能不是 Double#isNaN() 或 Double#isInfinite()。

)。

假设任何嵌套的Map的键都是字符串,我会递归地做:

@Suppress("UNCHECKED_CAST")
fun convertToJson(input: Map<String, Any>): JSONObject {
    val jsonObject = JSONObject()
    input.forEach { (key, value) ->
        value1 = if (value is Map<*, *>)
            convertToJson(value as Map<String, Any>)
        else
            value
        jsonObject.put(key, value1)
    }
    return jsonObject
}

(这确实应该扩展到处理List s、 null等,但这不是问题的一部分)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM