Reputation: 1553
I get the following JSON result from an external system:
{
"key1": "val1",
"key2": "val2",
"key3": "val3"
}
Now I want to display all keys and all values by using JSONPath. So I am looking for something to get key1, key2 and key3 as a result. Additionally I would like to use the index of a property, e. g. $....[2].key
to get "key3" etc.
Is there a way to do something like this?
Upvotes: 27
Views: 38795
Reputation: 1
in case you need the keys when using kubectl combined with jsonpath=, a workaround could be to have jq filter the keys only.
kubectl get secret my_secret --no-headers -o jsonpath='{.data}' | jq 'keys'
Upvotes: 0
Reputation: 544
For the java json path use below expression:
private static Configuration getConfiguration() {
return Configuration.builder().options(Option.AS_PATH_LIST).build();
}
DocumentContext parsedBodyWithJsonPath = using(getConfiguration()).parse(jso);
List<String> read = parsedBodyWithJsonPath.read("$.*");
System.out.println("keys: "+read);
output :
keys: ["$['key1']","$['key2']","$['key3']"]
Upvotes: 0
Reputation: 2783
I found that the tilda ~
symbol is able to retrieve the keys of the values it's called upon. So for your example a query like this:
$.*~
Returns this:
[
"key1",
"key2",
"key3"
]
Another example, if we had a JSON document like this:
{
"key1": "val1",
"key2": "val2",
"key3": {
"key31":"val31",
"key32":"val32"
}
}
A query like this:
$.key3.*~
Would return this:
[
"key31",
"key32"
]
It's important to note that these examples work on JSONPath.com and some other simulators/online tools, but on some they don't. It might come from the fact that I found out about the tilda(~) operator in the JSONPath plus documentation and not the official one.
Upvotes: 51