using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
""Sub_Status"": ""PENDING"",
""Patient_Gender"": ""M""
""Patient_Gender"": ""F""
""Sub_Status"": ""PENDING"",
""Sub_Status"": ""SHIPMENT"",
""Status"": ""SHIPMENT"",
""Patient_Gender"": ""M""
public static void Test()
var s = JToken.Parse(json);
Console.WriteLine("Initial JSON: ");
var result1 = TestIntersect(s);
var result2 = TestLinq(s);
if (!JToken.DeepEquals(result1, result2))
Console.WriteLine("WRONG result from Linq query.");
Console.WriteLine("Correct result from Linq query.");
var resultAndFirst = TestAndFirstQuery(s);
if (!JToken.DeepEquals(result1, resultAndFirst))
Console.WriteLine("WRONG result from \"&& first\" query.");
Console.WriteLine("Correct result from \"&& first\" query.");
var resultAndLast = TestAndLastQuery(s);
if (!JToken.DeepEquals(result1, resultAndLast))
Console.WriteLine("WRONG result from \"&& last\" query.");
Console.WriteLine("Correct result from \"&& last\" query.");
var resultParenthesized = TestParenthesizedQuery(s);
if (!JToken.DeepEquals(result1, resultParenthesized))
Console.WriteLine("WRONG result from Parenthesized query");
Console.WriteLine("Correct result from Parenthesized query");
private static JToken TestParenthesizedQuery(JToken s)
var filter = "$.Fields[?((@.Status == 'Pending' || @.Status == 'PENDING' || @.Status == 'SHIPMENT' || @.Status == 'DISPENSED') && (@.Patient_Gender))]";
Console.WriteLine("Testing JSONPath query with filter: ");
Console.WriteLine(filter);
var query = s.SelectTokens(filter);
var result = query.ToList();
var token = new JArray(result);
Console.WriteLine(token);
Console.WriteLine(ex.Message);
private static JToken TestAndFirstQuery(JToken s)
var filter = "$.Fields[?(@.Patient_Gender && @.Status == 'Pending' || @.Status == 'PENDING' || @.Status == 'SHIPMENT' || @.Status == 'DISPENSED')]";
var query = s.SelectTokens(filter);
var result = query.ToList();
var token = new JArray(result);
Console.WriteLine("Testing JSONPath query with filter: ");
Console.WriteLine(filter);
Console.WriteLine(token);
private static JToken TestAndLastQuery(JToken s)
var filter = "$.Fields[?(@.Status == 'Pending' || @.Status == 'PENDING' || @.Status == 'SHIPMENT' || @.Status == 'DISPENSED' && @.Patient_Gender)]";
var query = s.SelectTokens(filter);
var result = query.ToList();
var token = new JArray(result);
Console.WriteLine("Testing JSONPath query with filter: ");
Console.WriteLine(filter);
Console.WriteLine(token);
private static JToken TestIntersect(JToken s)
var query1 = s.SelectTokens("$.Fields[?(@.Status == 'Pending' || @.Status == 'PENDING' || @.Status == 'SHIPMENT' || @.Status == 'DISPENSED')]");
var query2 = s.SelectTokens("$.Fields[?(@.Patient_Gender)]");
var query = query1.Intersect(query2);
var result = query.ToList();
var array = new JArray(result);
Console.WriteLine("Testing LINQ INTERSECT query: ");
Console.WriteLine(array);
private static JToken TestLinq(JToken s)
var query = from t in s.SelectTokens("$.Fields[*]")
where (string)t["Patient_Gender"] != null
let status = (string)t["Status"]
where status == "Pending" || status == "PENDING" || status == "SHIPMENT" || status == "DISPENSED"
var result = query.ToList();
var array = new JArray(result);
Console.WriteLine("Testing LINQ WHERE query: ");
Console.WriteLine(array);
public static void Main()
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);