A Swift 5 implementation for IETF JSON-patch (RFC 6902).
iOS 8+
macOS 10.9+
SwiftyJSONPatch defines JSONPatcher value type.
JSONPatcher applies JSON-patches to JSON documents.
import SwiftyJSONPatch
let json = """
{ "foo": 1, "bar": "baz", "baz": null }
""".data(using: .utf8)!
let patch = """
[
{ "op": "test", "value": "baz", "path": "/bar" },
{ "op": "remove", "path": "/baz" },
{ "op": "add", "path": "/toto", "value": [1, 2, 3] },
{ "op": "replace", "path": "/toto/2", "value": "baz" },
{ "op": "copy", "from": "/foo", "path": "/toto/0" },
{ "op": "move", "from": "/bar", "path": "/foo" },
]
""".data(using: .utf8)!
let patcher = JSONPatcher()
do {
let patched = try patcher.apply(patch, on: json)
if let result = String(data: patched, encoding: .utf8) {
print(result) // {"foo":"baz","toto":[1,1,2,"baz"]}
}
} catch {
print("Error: \(error)")
}The JSONPatcher.PatchingError enum represents error cases JSONPatcher may throw while applying a patch :
public enum PatchingError: Error {
case document(Error) // failed to decode document JSON data
case patch(Error) // failed to decode patch JSON data
case operation(String, OperationError) // failed to apply specific patch operation
}The associated values gives you details about what have gone wrong.
The JSONPatcher.OperationError describes error cases while trying to perform patch operations :
public enum OperationError: Error {
case indexOutOfBounds(Int) // index out of bounds (index)
case memberNotFound(String) // member not found (name)
case notACollection // neither an array, nor an object
case notAnObject // not an object
case testFailure // test operation failed
case illegalMove(String, String) // wrong paths in move operation (from, path)
}Add github "vincedev/SwiftyJSONPatch" to your Cartfile.
You'll need SwiftLint to build the framework from source.
Clone the repository, open SwiftyJSONPatch.xworkspace.
Build the target for your preferred platform.
Open an issue if you have found a bug, or have a feature request.