当前位置: 首页 > 知识库问答 >
问题:

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

唐高卓
2023-03-14

我正在尝试将嵌套映射转换为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

我这样称呼它

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

我不明白的是为什么

输出。optJSONObject(“key1”)null?据我所知,输出。opt(“key1”)返回一个映射

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


共有2个答案

汪博达
2023-03-14

尝试将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
}

子车成和
2023-03-14

代码中的逻辑不会将映射的键放入嵌套对象,而是直接放入jsonObject。然后它还调用jsonObject。put(key,value)即使对于映射(我有点惊讶,它没有抛出异常,因为它不是允许的类型之一:

对象:JSONObject、JSONArray、字符串、布尔值、整数、长、双精度、NULL或空。可能不是双#isNaN()或双#is无限()。

).

假设任何嵌套的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等,但这不是问题的一部分)

 类似资料:
  • 但是当我输入一个cast时:它很好。演员阵容是我想要防止的,但这也限制了儿童建设者使用他们的特殊方法。最后一件事是有意义的,因为泛型类型只在运行时知道,但我不知道如何编写它,以便它在编译时工作。 谢谢你!

  • 我使用的API接受单个AKKA接收器,并用数据填充: 有没有一种方法,在不深入阿卡的深度的情况下,用两个汇而不是一个汇来处理输出? 例如 如果我可以访问方法使用的Flow,我可以使用,但流不会公开。 目前唯一的解决方法是将一个处理字符串的水槽传递给两个StringBuilder,以替换,但这似乎违背了AKKA的观点。如果不花几天时间学习AKKA,我就不知道是否有办法将输出从接收器中分离出来。 谢谢

  • 问题内容: 我有多个这样的人 它们不是嵌套的或类似的东西。基本上是不同的领域。我需要像这样在 node.js 中将它们组合为一个: 我可以很好地使用 jQuery 。这是浏览器中的一个工作示例: http://jsfiddle.net/qhoc/agp54/ 但是,如果我在 node.js中 执行此操作,则不希望加载jQuery(这有点用处,加上 node.js的jQuery 在 Windows

  • 我正在尝试在我的应用程序中使用Ehcache管理器。我想设置它没有xml配置。我有下一个依赖项: 我有这样的 CacheManager bean: 有没有可能把Ehcache CacheManager转换成Spring CacheManager?我觉得应该有这样的:< code > return new JCacheCacheManager(/* some code */);

  • 问题内容: 所以我看过很多这样的例子: 您似乎可以通过成功函数以警报的形式查看从c#方法返回的数据。但是,如果我想在函数调用之外访问此“ input + 1”数据,该怎么做呢?另外我不确定如何调用没有参数的方法? 最后,我想使用通过ajax调用的ac#方法返回的JSON数据填充下拉列表,但是我不确定如何处理似乎卡在函数中的JSON数据呼叫? 抱歉,我是Jquery / AJAX / etc的新手,

  • 问题内容: 我想知道是否有一种方法可以将布尔值转换为int而不使用if语句(以免破坏管道)。例如,我可以写 但是我想知道是否有一种方法可以不使用if语句,例如Python的 我也觉得你可以做 但是,这会创建一个额外的对象,因此它确实很浪费,而且我发现它比if语句方式还要慢(它不一定效率低下,只是有一个弱点)。 问题答案: 除了if外,不能使用布尔值。但是,这并不意味着在装配级别将有一个分支。 如果