Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
324 views
in Technique[技术] by (71.8m points)

json - select all keys with given value

With jq, how do I select all objects, which may be nested, with a desired value?

For example, given the following:

{
    "a": "b",
    "c": {
        "d": {
            "e": "f",
            "z": "b"
        }
    }
}

How do I filter down to objects whose value is "b"?

{
    "a": "b",
    "c": {
        "d": {
            "z": "b"
        }
    }
}

Conversely, how do I select objects whose value is not "b"?

{
    "c": {
        "d": {
            "e": "f"
        }
    }
}


I've attempted at the problem by using the select and walk functions, but could not get exactly what I wanted.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

For the first question:

reduce paths(. == "b") as $p ({}; setpath($p; "b"))

For the second:

reduce paths(. == "b") as $p (.; delpaths([$p]))

or even more succinctly:

delpaths( [ paths(. == "b") ] )

Furthermore

The first question can also be answered without reduce, but to get it right generically requires more verbosity, e.g.:

delpaths( [ paths( (. !="b") and (type|IN("object","array") | not) ) ] )

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...