tidwall / gjson

Get JSON values quickly - JSON parser for Go
MIT License
13.88k stars 841 forks source link

how to get all matching fields, the path is uncertain #313

Open litao09h opened 1 year ago

litao09h commented 1 year ago

Example:

{
    "k1": {
        "text": "m1",
        "v": 1
    },
    "k2": {
        "child": {
            "text": "n2",
            "v": 1
        }
    },
    "k3": {
        "v": 1
    }
}

example in jsonPath: express: $..text output: ["m1","n2"]

liveFreeOrCode commented 11 months ago

@litao09h, were you ever able to figure this out? I'm looking to do the same thing

volans- commented 11 months ago

@litao09h @liveFreeOrCode As far as I know it's not possible to do it for the generic case of arbitrary depths. But if you know in advance the possible depths where the field is present though then it becomes doable with a bit of a verbose query. For example for the specific case above with depth 1 and 2 a query of the form:

[@values.#.text,@values.#.@values.#.text].@flatten:{"deep":true}

gives you:

["m1","n2"]

The [] around is a multipaths to create a new object, and the @flatten is needed to remove all the empty lists for the part of the query for depth two.