Skip Menu |

This queue is for tickets about the JSON-Path CPAN distribution.

Report information
The Basics
Id: 115745
Status: rejected
Priority: 0/
Queue: JSON-Path

People
Owner: Nobody in particular
Requestors: popefelix [...] gmail.com
Cc:
AdminCc:

Bug Information
Severity: (no value)
Broken in: (no value)
Fixed in: (no value)



Subject: Filter expressions not properly handled
Given the JSON example at http://goessner.net/articles/JsonPath/index.html#e3, the JSONPath expression '$..book[?(@.isbn=="0-395-19395-8")]' should return: { "category" => "fiction", "author" => "Herman Melville", "title" => "Moby Dick", "isbn" => "0-553-21311-3", "price" ==> 8.99 } Instead it throws an error, "non-safe evaluation, died".
Subject: jsonpath.pl
use JSON::Path; use Data::Dumper; my $json = q( { "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 } } } ); my $val = JSON::Path->new('$..book[?(@.isbn="0-553-21311-3")]')->value($json); print Dumper $val;
In the JSONPath spec, the following: ?( ... ) is evaluated as a string of code. You're using a string of Javascript code: ?(@.isbn="0-553-21311-3") You need to use Perl code: ?( $_->{isbn} eq "0-553-21311-3" ) Also, because running eval on arbitrary code is potentially dangerous, you need to opt in to it: local $JSON::Path::Safe = 0; This is all in the documentation.
See my PR addressing this issue. On Tue Feb 07 12:53:37 2017, TOBYINK wrote: Show quoted text
> In the JSONPath spec, the following: > > ?( ... ) > > is evaluated as a string of code. You're using a string of Javascript > code: > > ?(@.isbn="0-553-21311-3") > > You need to use Perl code: > > ?( $_->{isbn} eq "0-553-21311-3" ) > > Also, because running eval on arbitrary code is potentially dangerous, > you need to opt in to it: > > local $JSON::Path::Safe = 0; > > This is all in the documentation.