JSONTokenizer is a project design to demonstrate parsing JSON using Swift's awesome regular expression support. It might also be useful if you wish to handle broken JSON when you don't have a choice. JSONTokenizer leaves as much as it can for you to deal with yourself. Good Luck!
{
"Hello" : "World"
}.object([(key: .string("Hello"), value: .string("World"))])JSONTokenizer doesn't care that an object's key is a quoted string, just that it's a valid JSONToken. Therefore the following is valid:
{
["Hello"] : "World"
}.object([(key: .array([.string("Hello")]), value: .string("World"))])JSONTokenizer doesn't handle null, booleans and numbers, it just captures them as barewords for you to handle as you wish. This avoids any preprocessing Swift might do (ie, treat 0 and 0.0 as identical)
[
null,
true,
10e-30,
0,
0.0
].array([.bareword("null"), .bareword("true"), .bareword("10e-30"), .bareword("0"), .bareword("0.0")])JSONTokenizer can also be used directly in a regular expression as it conforms to RegexComponent.
let token = Reference(JSONToken.self)
let regex = Regex {
"Hello"
OneOrMore(.whitespace)
Capture(as: token) {
JSONTokenizer()
}
OneOrMore(.whitespace)
"World"
}
let input = """
Hello ["small", "big"] World
"""
let result = try regex.wholeMatch(in: input)
print(result![token]).array([.string("small"), .string("big")])