I am facing an issue with phasing data using jsonpath-ng. My expression looks like:
$..[?(@.name=='is_literate')]
I tried it at https://jsonpath.com/, it works fine with $..[?(@.name=='is_literate')] expression, but when I tried the given expression with jsonpath-ng, it throws an error.
My Python code looks like following:
from jsonpath_ng.ext import parse
exp = "$..[?(@.name=='is_literate')]"
filter_query = parse(exp)
filtered_data = [match.value for match in filter_query.find(label_data)]
print(filtered_data)
The error looks like:
---------------------------------------------------------------------------
JsonPathParserError Traceback (most recent call last)
Cell In[31], line 3
1 from jsonpath_ng.ext import parse
2 exp = "$..[?(@.name=='is_literate')]"
----> 3 filter_query = parse(exp)
4 filtered_data = [match.value for match in filter_query.find(label_data)]
5 print(filtered_data)
File ~/Desktop/mstech/Digital_Profile/data_haneling/venv/lib/python3.12/site-packages/jsonpath_ng/ext/parser.py:176, in parse(path, debug)
175 def parse(path, debug=False):
--> 176 return ExtentedJsonPathParser(debug=debug).parse(path)
File ~/Desktop/mstech/Digital_Profile/data_haneling/venv/lib/python3.12/site-packages/jsonpath_ng/parser.py:58, in JsonPathParser.parse(self, string, lexer)
56 def parse(self, string, lexer = None):
57 lexer = lexer or self.lexer_class()
---> 58 return self.parse_token_stream(lexer.tokenize(string))
File ~/Desktop/mstech/Digital_Profile/data_haneling/venv/lib/python3.12/site-packages/jsonpath_ng/parser.py:61, in JsonPathParser.parse_token_stream(self, token_iterator)
60 def parse_token_stream(self, token_iterator):
---> 61 return self.parser.parse(lexer = IteratorToTokenStream(token_iterator))
File ~/Desktop/mstech/Digital_Profile/data_haneling/venv/lib/python3.12/site-packages/ply/yacc.py:333, in LRParser.parse(self, input, lexer, debug, tracking, tokenfunc)
331 return self.parseopt(input, lexer, debug, tracking, tokenfunc)
332 else:
--> 333 return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
File ~/Desktop/mstech/Digital_Profile/data_haneling/venv/lib/python3.12/site-packages/ply/yacc.py:1201, in LRParser.parseopt_notrack(self, input, lexer, debug, tracking, tokenfunc)
1199 errtoken.lexer = lexer
1200 self.state = state
-> 1201 tok = call_errorfunc(self.errorfunc, errtoken, self)
1202 if self.errorok:
1203 # User must have done some kind of panic
1204 # mode recovery on their own. The
1205 # returned token is the next lookahead
1206 lookahead = tok
File ~/Desktop/mstech/Digital_Profile/data_haneling/venv/lib/python3.12/site-packages/ply/yacc.py:192, in call_errorfunc(errorfunc, token, parser)
190 _token = parser.token
191 _restart = parser.restart
--> 192 r = errorfunc(token)
193 try:
194 del _errok, _token, _restart
File ~/Desktop/mstech/Digital_Profile/data_haneling/venv/lib/python3.12/site-packages/jsonpath_ng/parser.py:78, in JsonPathParser.p_error(self, t)
76 if t is None:
77 raise JsonPathParserError('Parse error near the end of string!')
---> 78 raise JsonPathParserError('Parse error at %s:%s near token %s (%s)'
79 % (t.lineno, t.col, t.value, t.type))
JsonPathParserError: Parse error at 1:4 near token ? (?)
I want following output while using $..[?(@.name=='is_literate')]:
[
{
"control": {
"appearance": "quick"
},
"children": [
{
"name": "is_literate_1",
"label": "साक्षर"
},
{
"name": "is_literate_0",
"label": "निरक्षर"
}
],
"name": "is_literate",
"label": "${full_name}: साक्षर कि निरक्षर ?",
"bind": {
"required": "true"
},
"type": "select one"
}
]
Note: I have the name of the label, but I don't have label. I need the label based on the name value.
I am attaching the JSON file for reference: https://github.com/user-attachments/files/21955956/form_label_output.json
I switched the package from jsonpath-ng to the python-jsonpath (https://pypi.org/project/python-jsonpath/) package, and this resolved my issue.
Then, I did the following,
import jsonpath
filter_data = jsonpath.findall("$..[?(@.name=='is_literate')]", data)