I'm using Newtonsoft's Json.Net to select nodes from the following json:
{
"projects":[
{
"name":"Project 1",
"client":{
"code":"ABC",
"name":"Client 1"
}
},
{
"name":"Project 2",
"client":{
"code":"DEF",
"name":"Client 2"
}
},
{
"name":"Project 3",
"client":{
"code":"GHI",
"name":"Client 3"
}
}
]
}
The following c# snippet
//json is a JObject representation of the json listed above
var clients = json.SelectTokens("$.projects[*].client");
Yields:
[
{
"code":"ABC",
"name":"Client 1"
},
{
"code":"DEF",
"name":"Client 2"
},
{
"code":"GHI",
"name":"Client 3"
}
]
Which is cool, now, what I'd like to do is filter by client code, I would think that
$.projects[*].client[?(@.code == 'DEF')]
would work, but I obviously don't understand the syntax well enough. This returns an empty list:
var test1 = json.SelectTokens("$.projects[*].client[?(@.code == 'DEF')]").ToList();
And the single token selector returns a null:
var test2 = json.SelectToken("$.projects[*].client[?(@.code == 'DEF')]");
I tried a few different configurations on https://jsonpath.curiousconcept.com/ and it seems my query syntax is indeed broken.
Using Flow Communications' JSONPath 0.3.4 implementation (on the above link) I can get the client using
$..[?(@.code == 'DEF')]
however, this syntax does not seem valid for Json.Net (nor the Goessner implementation on the same page).
Anyone see what I'm doing wrong?
See Question&Answers more detail:
os