【问题标题】:how to convert json into key value pair completely using groovy如何使用groovy将json完全转换为键值对
【发布时间】:2015-03-16 08:38:28
【问题描述】:

我正在尝试将 json 转换为映射作为键值对我有一个方法 JsonSlurper() 它给了我键值对但我的查询是我有一个如下所示的 json。

{"Result":"null",
"gbet":{"Qpet":[
{"msg":"MSG","over":"N","repair":[{"notification":null,"sce":"1","repair1":"CA","repairDes":null,"ran":1},
{"rep":"dvr"}],
{"msgger":"MSGwe","overw":"Ner"}]
}

如何使用每个键值对在单个映射中获取所有内容 我就是这样的

 def slurper = new JsonSlurper().parseText(str)

    log.info("sulpher"+slurper)
    def keys=slurper.keySet();
    log.info('keys'+keys)

但它不适合我 我希望每个键和值对作为一个单独的字段。

【问题讨论】:

  • 您能否在最后添加一个完整示例,说明您想要的内容。但请注意:如果您只是想展平地图,通常有一个 api 返回列表的原因:可能有多个结果。
  • 我想要:-{"result":"null","msg":"MSG","over":"N","notifiacation":"null","sec": "1"} 就像所有值都应该出现在一个地图中
  • 你知道你会丢失任何重复的密钥吗?
  • 是的,目前我只想要没有重复键的简单地图。我会修改代码,如果你有请帮忙...

标签: json parsing groovy multimap


【解决方案1】:

根据您提供的 JSON 字符串;它只有两个父键,即 Result 和 gbet。 gbet 在其中有其他节点。您将不得不修复您的字符串或编写您自己的方法来压平字符串。没有开箱即用的功能可用于实现您的要求。

【讨论】:

  • 但我无法做到这一点,因为我的键值对我来说是未知的,这只是一个示例 json,我还有更多,所以我需要一个可以创建带有键值对的映射的函数.. .有可能吗?
【解决方案2】:

您必须实现自己的 flatten 方法。例如:

Map flattenMap(Map json) {
def result = [:]
json.each { k, v ->
    if (v instanceof Map) {
        result << flattenMap(v)
    } else if (v instanceof Collection && v.every {it instanceof Map}) {
        v.each { result << flattenMap(it) }
    } else {
        result[k] = v
    }
}
result
}

这个例子使用了递归,所以如果嵌套太深就会溢出。它不适用于您的示例,因为它不是有效的 json。

【讨论】:

  • 为什么它不是一个有效的 json .?
  • 在您的代码中,我们究竟要获取什么,您能详细解释一下吗..?
  • 我的代码是一种方法,因此您可以使用已解析的 json 调用它,在您的情况下,顶层是一个 Map。您的示例中的 json 无法解析。
猜你喜欢
  • 2016-03-14
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
相关资源
最近更新 更多