Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Literals which are unquoted strings not being verified for JSON syntax #229

Open
diazona opened this issue Jul 27, 2021 · 0 comments
Open

Comments

@diazona
Copy link

diazona commented Jul 27, 2021

My understanding based on the specification is that the content of a literal expression, i.e. the text between backticks, is supposed to be a valid JSON expression, otherwise it should be reported as a syntax error. The Python implementation seems to be treating them as strings instead, though. For example, this is accepted as a valid JMESPath expression:

thing == `wat`

even though I would think it should cause an error. Is this an actual bug in the Python implementation, or have I been misunderstanding the spec? (In the latter case I'd argue that the spec is misleading about this to the point of it being a documentation bug, but that's a separate issue.)

Here's a short script that demonstrates the error:

import jmespath, json, sys

literal_json = 'wat'
expression = f"thing == `{literal_json}`"
document = {"thing": "wat"}

try:
    r = json.loads(literal_json)
except Exception as e:
    print(f"json: parse error: {e.__class__.__name__}")
else:
    print("json: no parse error")
    print(f"  result: {r!r}")

try:
    r = jmespath.search(expression, document)
except Exception as e:
    print(f"jmespath: parse error: {e.__class__.__name__}")
else:
    print("jmespath: no parse error")
    print(f"  result: {r!r}")

It prints out the following:

$ python test-jmespath.py 
json: parse error: JSONDecodeError
jmespath: no parse error
  result: True

I would expect to see the jmespath part of the output be the same as the json part of the output, i.e. some kind of parsing error. And if I try other kinds of values, I do indeed get consistent results. For example, replacing the literal_json assignment line with literal_json = '3' gives

$ python test-jmespath.py 
json: no parse error
result: 3
jmespath: no parse error
result: False

and if I replace it with literal_json = '{"foo": bar}' I get

$ python test-jmespath.py 
json: parse error: JSONDecodeError
jmespath: parse error: LexerError
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant