【问题标题】:Converting to JSONObject and back in Kotlin without Library在没有库的情况下转换为 JSONObject 并返回 Kotlin
【发布时间】:2020-03-16 23:01:03
【问题描述】:

我正在尝试将嵌套 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
    }

(我试着按照这个例子Putting HashMap<String, object> in jsonobject

我这样称呼它

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

我不明白,为什么是

output.optJSONObject("key1") 空? 据我了解,output.opt("key1") 返回Map&lt;*, *&gt;

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

【问题讨论】:

    标签: java android kotlin


    【解决方案1】:

    代码中的逻辑不会将Map 的键放入嵌套对象,而是直接放入jsonObject。然后它也调用jsonObject.put(key, value),即使是Map(我有点惊讶它没有抛出异常,因为它不是allowed types之一:

    对象:JSONObject、JSONArray、String、Boolean、Integer、Long、Double、NULL 或 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
    }
    

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

    【讨论】:

    • Derp,谢谢。直到现在还没有做过 Java/Kotlin。
    【解决方案2】:

    尝试将JSONObject 放入JSONObject 而不是Map&lt;*, *&gt;

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多