Decoding JSON from scratch in Swift
30th
August 2025
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!
Examples
Normal object
{ "Hello" : "World" }
.object([(key: .string("Hello"), value: .string("World"))])
Weird object
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"))])
Null, booleans and numbers
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, treat0
and0.0
as identical)[ null, true, 10e-30, 0, 0.0 ]
.array([.bareword("null"), .bareword("true"), .bareword("10e-30"), .bareword("0"), .bareword("0.0")])
Inside a regular expression
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")])