json = _{ SOI ~ (object | array | string | number | boolean | null) ~ EOI }
WHITESPACE = _{ " " | "\t" | "\r" | "\n" }
object = {
("#{" | "{") ~ "}"
| ("#{" | "{") ~ key_value_pair ~ ("," ~ key_value_pair)* ~ "}"
}
key_value_pair = { string ~ ":" ~ value }
array = {
"[" ~ "]"
| "[" ~ value ~ ("," ~ value)* ~ "]"
}
value = _{ object | array | string | number | boolean | null }
boolean = { "true" | "false" }
null = { "null" }
string = ${ "\"" ~ inner ~ "\"" }
inner = @{ char* }
char = {
!("\"" | "\\") ~ ANY
| "\\" ~ ("\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t")
| "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
}
number = @{
"-"? ~ ("0" | ASCII_NONZERO_DIGIT ~ ASCII_DIGIT*) ~ ("." ~ ASCII_DIGIT*)? ~ (^"e" ~ ("+" | "-")? ~ ASCII_DIGIT+)?
}