Skip to content

Support filtering after advanced feature functions like @array() (e.g., $.store..*@array()[?(@property !== 0)]) #246

@Laavanja19

Description

@Laavanja19

Consider the given sample JSON document

{
    "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
        }
    }
}

JSONPath Plus currently supports advanced feature functions such as

@array(),
@object() and so on.

This correctly returns the elements under any node.

Example JSONPath expression

$.store..*@array()

Output

[
  [
    {
      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
    }
  ]
]

Improvement
When a filter which contains another JSONPath Plus feature ,

Example JSONPath expression

$.store..*@array()[?(@property !== 0)]

JSONPath Plus stops evaluating after @array() and does not process the next filter expression.
The second filter block [?(@property !==0)]is not processed at all.

Actual Output

[
  [
    {
      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
    }
  ]
]

Expected Output : After evaluating @array(), the engine must continue processing the next filters.

[
     {
      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
    }
]

So, the pipeline should work like this :

  • First it processes $.store..*@array() .
  • Then the processed results should be passed to the next filter. In this case, it is [?(@property !==0)]
  • Return the final results after processing all the filters

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions