Ultra-high-performance Optimistic JSON Parser for Swift
Swift
0
7 commits
updated Jun 12, 2025
π Ultra-high-performance optimistic JSON parser for Swift
A fault-tolerant JSON parser that gracefully handles malformed JSON while delivering exceptional performance. Inspired by simdjson On-Demand parsing techniques.
Add to your Package.swift:
dependencies: [
.package(url: "https://github.com/fumito-ito/OptimisticJSONParser.git", from: "0.0.1")
]
Copy OptimisticJSONParser.swift to your project.
import OptimisticJSONParser
let parser = OptimisticJSONParser()
// Parse complete JSON
let result = parser.parse("""
{
"name": "John",
"age": 30,
"skills": ["Swift", "JSON"]
}
""")
print(result)
// Output: ["name": "John", "age": 30, "skills": ["Swift", "JSON"]]
let parser = OptimisticJSONParser()
// Missing closing bracket
let incomplete = parser.parse("""["apple", "banana", "cherry"""")
print(incomplete) // ["apple", "banana", "cherry"]
// Incomplete numbers
let incompleteNumber = parser.parse("""{"price": 12.}""")
print(incompleteNumber) // ["price": 12.0]
// Unclosed strings
let unclosedString = parser.parse("""{"message": "Hello world""")
print(unclosedString) // ["message": "Hello world"]
// Mixed malformed JSON
let mixed = parser.parse("""[1, 2, {"key": "value"""")
print(mixed) // [1, 2, ["key": "value"]]
let parser = OptimisticJSONParser() // Reuse for better performance
// Process large datasets
let largeJSON = loadLargeJSONFile()
let startTime = CFAbsoluteTimeGetCurrent()
if let data = parser.parse(largeJSON) {
let duration = CFAbsoluteTimeGetCurrent() - startTime
print("Parsed \(largeJSON.count) bytes in \(duration * 1000) ms")
print("Speed: \(Double(largeJSON.count) / duration / 1024 / 1024) MB/s")
}
| Input | Standard Parser | OptimisticJSONParser |
|---|---|---|
["a", "b" | β Error | β
["a", "b"] |
{"value": 12.} | β Error | β
{"value": 12.0} |
{"key": "val | β Error | β
{"key": "val"} |
[1, 2 3] | β Error | β
[1, 2, 3] |
{"a":1,"b":} | β Error | β
{"a": 1} |
OptimisticJSONParser uses a two-phase approach inspired by simdjson:
[, {, ", numbers, etc.Input JSON β Structural Index β On-Demand Parser β Swift Objects
β β β β
"[1,2,3]" [0,1,3,5,6] Value Iterator [1, 2, 3]
OptimisticJSONParser prioritizes data extraction over strict compliance:
let parser = OptimisticJSONParser()
// Returns partial data instead of throwing errors
let result = parser.parse("""{"broken": json}""")
// May return ["broken": nil] or partial object
// For strict validation, use Foundation's JSONSerialization
do {
let strict = try JSONSerialization.jsonObject(with: data)
} catch {
// Handle strict parsing errors
let optimistic = parser.parse(string) // Fallback to optimistic
}
Reuse parser instances:
let parser = OptimisticJSONParser() // Create once
for json in jsonStrings {
let result = parser.parse(json) // Reuse many times
}
Avoid string copying:
// Efficient - direct string parsing
let result = parser.parse(jsonString)
// Less efficient - unnecessary data conversion
let data = jsonString.data(using: .utf8)!
let string = String(data: data, encoding: .utf8)!
let result = parser.parse(string)
Profile with large datasets:
// Measure actual performance with your data
let iterations = 1000
let start = CFAbsoluteTimeGetCurrent()
for _ in 0..<iterations {
_ = parser.parse(yourJSON)
}
let avgTime = (CFAbsoluteTimeGetCurrent() - start) / Double(iterations)
The parser includes comprehensive tests covering:
Run tests:
swift test
| Feature | Foundation JSONSerialization | OptimisticJSONParser |
|---|---|---|
| Speed | ~5-10 MB/s | ~20-30 MB/s |
| Fault tolerance | β Strict | β Optimistic |
| Malformed JSON | β Throws errors | β Extracts data |
| Memory usage | Higher | Lower |
| Dependencies | Foundation | None |
| Standards compliance | β Strict RFC 8259 | β οΈ Optimistic |
This parser is inspired by:
Contributions are welcome! Please:
MIT License - see LICENSE for details.
Made with β€οΈ for the Swift community
"Sometimes you need to be optimistic about your JSON" π
7 commits
Swift
100.0%
Ultra-high-performance Optimistic JSON Parser for Swift
Swift
0
7 commits
updated Jun 12, 2025
π Ultra-high-performance optimistic JSON parser for Swift
A fault-tolerant JSON parser that gracefully handles malformed JSON while delivering exceptional performance. Inspired by simdjson On-Demand parsing techniques.
Add to your Package.swift:
dependencies: [
.package(url: "https://github.com/fumito-ito/OptimisticJSONParser.git", from: "0.0.1")
]
Copy OptimisticJSONParser.swift to your project.
import OptimisticJSONParser
let parser = OptimisticJSONParser()
// Parse complete JSON
let result = parser.parse("""
{
"name": "John",
"age": 30,
"skills": ["Swift", "JSON"]
}
""")
print(result)
// Output: ["name": "John", "age": 30, "skills": ["Swift", "JSON"]]
let parser = OptimisticJSONParser()
// Missing closing bracket
let incomplete = parser.parse("""["apple", "banana", "cherry"""")
print(incomplete) // ["apple", "banana", "cherry"]
// Incomplete numbers
let incompleteNumber = parser.parse("""{"price": 12.}""")
print(incompleteNumber) // ["price": 12.0]
// Unclosed strings
let unclosedString = parser.parse("""{"message": "Hello world""")
print(unclosedString) // ["message": "Hello world"]
// Mixed malformed JSON
let mixed = parser.parse("""[1, 2, {"key": "value"""")
print(mixed) // [1, 2, ["key": "value"]]
let parser = OptimisticJSONParser() // Reuse for better performance
// Process large datasets
let largeJSON = loadLargeJSONFile()
let startTime = CFAbsoluteTimeGetCurrent()
if let data = parser.parse(largeJSON) {
let duration = CFAbsoluteTimeGetCurrent() - startTime
print("Parsed \(largeJSON.count) bytes in \(duration * 1000) ms")
print("Speed: \(Double(largeJSON.count) / duration / 1024 / 1024) MB/s")
}
| Input | Standard Parser | OptimisticJSONParser |
|---|---|---|
["a", "b" | β Error | β
["a", "b"] |
{"value": 12.} | β Error | β
{"value": 12.0} |
{"key": "val | β Error | β
{"key": "val"} |
[1, 2 3] | β Error | β
[1, 2, 3] |
{"a":1,"b":} | β Error | β
{"a": 1} |
OptimisticJSONParser uses a two-phase approach inspired by simdjson:
[, {, ", numbers, etc.Input JSON β Structural Index β On-Demand Parser β Swift Objects
β β β β
"[1,2,3]" [0,1,3,5,6] Value Iterator [1, 2, 3]
OptimisticJSONParser prioritizes data extraction over strict compliance:
let parser = OptimisticJSONParser()
// Returns partial data instead of throwing errors
let result = parser.parse("""{"broken": json}""")
// May return ["broken": nil] or partial object
// For strict validation, use Foundation's JSONSerialization
do {
let strict = try JSONSerialization.jsonObject(with: data)
} catch {
// Handle strict parsing errors
let optimistic = parser.parse(string) // Fallback to optimistic
}
Reuse parser instances:
let parser = OptimisticJSONParser() // Create once
for json in jsonStrings {
let result = parser.parse(json) // Reuse many times
}
Avoid string copying:
// Efficient - direct string parsing
let result = parser.parse(jsonString)
// Less efficient - unnecessary data conversion
let data = jsonString.data(using: .utf8)!
let string = String(data: data, encoding: .utf8)!
let result = parser.parse(string)
Profile with large datasets:
// Measure actual performance with your data
let iterations = 1000
let start = CFAbsoluteTimeGetCurrent()
for _ in 0..<iterations {
_ = parser.parse(yourJSON)
}
let avgTime = (CFAbsoluteTimeGetCurrent() - start) / Double(iterations)
The parser includes comprehensive tests covering:
Run tests:
swift test
| Feature | Foundation JSONSerialization | OptimisticJSONParser |
|---|---|---|
| Speed | ~5-10 MB/s | ~20-30 MB/s |
| Fault tolerance | β Strict | β Optimistic |
| Malformed JSON | β Throws errors | β Extracts data |
| Memory usage | Higher | Lower |
| Dependencies | Foundation | None |
| Standards compliance | β Strict RFC 8259 | β οΈ Optimistic |
This parser is inspired by:
Contributions are welcome! Please:
MIT License - see LICENSE for details.
Made with β€οΈ for the Swift community
"Sometimes you need to be optimistic about your JSON" π
7 commits
Swift
100.0%