The grammar from https://www.json.org/json-en.html has been transformed to be LL(1) parseable. In particular, this means it has no left-recursion and the grammar rule which needs to be applied can be determined by looking at the next character.
json
element
value
object
array
string
number
"true"
"false"
"null"
object
'{' members '}'
members
""
member members+
members+
""
',' members
member
ws string ws ':' element
array
'[' elements ']'
elements
""
element elements+
elements+
""
',' elements
element
ws value ws
string
'"' characters '"'
characters
""
character characters
character
'0020' . '10FFFF' - '"' - '\'
'\' escape
escape
'"'
'\'
'/'
'b'
'f'
'n'
'r'
't'
'u' hex hex hex hex
hex
digit
'A' . 'F'
'a' . 'f'
number
integer fraction exponent
integer
positive_integer
'-' positive_integer
positive_integer
'0'
onenine digits
digits
""
digit digits
digit
'0'
onenine
onenine
'1' . '9'
fraction
""
'.' digit digits
exponent
""
'E' sign digits
'e' sign digits
sign
""
'+'
'-'
ws
""
'0020' ws
'000A' ws
'000D' ws
'0009' ws