JamesNK / Newtonsoft.Json

Json.NET is a popular high-performance JSON framework for .NET
https://www.newtonsoft.com/json
MIT License
10.76k stars 3.25k forks source link

jPath can't work if I want to filter without some property #2583

Open luruibo1995 opened 3 years ago

luruibo1995 commented 3 years ago

Source/destination types

jToken.SelectTokens("$..book[?(!@.isbn)]")

or

jToken.SelectTokens("$..book[?(@.isbn == null)]")

Source/destination JSON

{ 
"store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

Expected behavior

filter the books without isbn number

Actual behavior

The first line code gets: There is an expection on the character '!'. Newtonsoft.Json.JsonException: 'Unexpected character while parsing path query: !'

There is no result from the second line code.

Steps to reproduce

public static void Test14()
        {
            var testString = @"{ 
    'store': {
        'book': [
        {
                'category': 'reference',
                'author': 'Nigel Rees',
        'title': 'Sayings of the Century',
        'price': 8.95
      },
      {
                'category': 'fiction',
        'author': 'Evelyn Waugh',
        'title': 'Sword of Honour',
        'price': 12.99
      },
      {
                'category': 'fiction',
        'author': 'Herman Melville',
        'title': 'Moby Dick',
        'isbn': '0-553-21311-3',
        'price': 8.99
      },
      {
                'category': 'fiction',
        'author': 'J. R. R. Tolkien',
        'title': 'The Lord of the Rings',
        'isbn': '0-395-19395-8',
        'price': 22.99
      }
    ],
    'bicycle': {
                'color': 'red',
      'price': 19.95
    }
        }
    }";

            var jObject = JObject.Parse(testString);
            var jTokens = jObject.SelectTokens(@"$..book[?(!@.isbn)]");

            foreach(var jToken in jTokens)
            {
                Console.WriteLine(jToken);
            }
        }

So, does it not support or it is a bug and can you give me another way to filter without the property?

phayman commented 2 years ago

Getting the same issue, would love to see this fixed.

afrowuk commented 2 years ago

Same issue here too. Would be great if this could be fixed.