0

我需要实现一种方法,该方法将扫描特定的 JSON 字符串targetField并返回该字段的值(如果存在),或者null(如果不存在):

// Ex: extractFieldValue(/{ "fizz" : "buzz" }/, 'fizz') => 'buzz'
// Ex: extractFieldValue(/{ "fizz" : "buzz" }/, 'foo') => null
String extractFieldValue(String json, String targetField) {
    // ...
}

此解决方案必须是递归的,并且可以在(分层)JSON 字符串中的任何嵌套级别上工作。它也需要适用于 JSON 数组。

到目前为止我最好的尝试:

String extractFieldValue(String json, String targetField) {
    def slurper = new JsonSlurper()
    def jsonMap = slurper.parseText(json)

    jsonMap."${targetField}"
}

这仅适用于顶级(非嵌套)JSON 字段。我问谷歌大神如何JsonSlurper递归使用,但找不到任何有用的东西。这里有什么想法吗?

4

1 回答 1

2

给定一个名为 的变量中的输入字符串json

{
    "a":"a",
    "b":{"f":"f", "g":"g"},
    "c":"c",
    "d":"d",
    "e":[{"h":"h"}, {"i":{"j":"j"}}],
}

这个脚本:

import groovy.json.JsonSlurper

def mapOrCollection (def it) {
    it instanceof Map || it instanceof Collection
}

def findDeep(def tree, String key) {
    switch (tree) {
        case Map: return tree.findResult { k, v ->
            mapOrCollection(v)
                ? findDeep(v, key)
                : k == key
                    ? v
                    : null
        }
        case Collection: return tree.findResult { e ->
            mapOrCollection(e)
                ? findDeep(e, key)
                : null
        }
        default: return null
    }
}

('a'..'k').each { key ->
    def found = findDeep(new JsonSlurper().parseText(json), key)
    println "${key}: ${found}"
}

给出这些结果:

a: a
b: null
c: c
d: d
e: null
f: f
g: g
h: h
i: null
j: j
k: null
于 2016-10-14T21:18:46.940 回答