1root   ::= object
 2value  ::= object | array | string | number | ("true" | "false" | "null") ws
 3
 4object ::=
 5  "{" ws (
 6            string ":" ws value
 7    ("," ws string ":" ws value)*
 8  )? "}" ws
 9
10array  ::=
11  "[" ws (
12            value
13    ("," ws value)*
14  )? "]" ws
15
16string ::=
17  "\"" (
18    [^"\\\x7F\x00-\x1F] |
19    "\\" (["\\bfnrt] | "u" [0-9a-fA-F]{4}) # escapes
20  )* "\"" ws
21
22number ::= ("-"? ([0-9] | [1-9] [0-9]{0,15})) ("." [0-9]+)? ([eE] [-+]? [0-9] [1-9]{0,15})? ws
23
24# Optional space: by convention, applied in this grammar after literal chars when allowed
25ws ::= | " " | "\n" [ \t]{0,20}