pythonjsonjsonpathjsonpath-ng

$..[?(@.name=='is_literate')] expression works completely fine on `https://jsonpath.com` but it throw an error while using expression at `jsonpath-ng`


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


Solution

  • 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)