by Gregory Combs
(MIT License - 2014)
JSON Patch, JSON Pointer, and JSON Schema Validation in Objective-C
This Objective-C library is a collection of classes and categories that implement three powerful new features (JSON Patch, JSON Pointer, JSON Schema) that work with JSON data (represented by NSDictionaries and NSArrays in Objective-C). Unit tests are included for each component.
To build the test project, be sure to do the following:
- Install CocoaPods (use homebrew) if you haven't already.
- Run
pod install
from the command line. - Open the newly created JSONToolsTests.xcworkspace document not the JSONToolsTests.xcodeproj document.
- Hit Command-U to run the tests.
-
JSON Patch - IETF RFC6902: Create and apply operation patches (add, remove, copy, move, test, _get) to serially transform JSON Data. This functionality was inspired by Joachim Wester's JavaScript implementation of JSON Patch.
-
Example Patch Copy:
#import "JSONTools.h" #import "JSONDeeplyMutable.h" - (void)examplePatchCopy { NSMutableDictionary *obj = nil; NSMutableDictionary *expected = nil; NSDictionary *patch = nil; obj = [@{@"foo": @1, @"baz": @[@{@"qux": @"hello"}]} copyAsDeeplyMutableJSON]; patch = @{@"op": @"copy", @"from": @"/foo", @"path": @"/bar"}; [JSONPatch applyPatches:@[patch] toCollection:obj]; expected = [@{@"foo": @1, @"baz": @[@{@"qux": @"hello"}], @"bar": @1} copyAsDeeplyMutableJSON]; }
-
Example Patch Generation (JSON Diff):
#import "JSONTools.h" - (void)examplePatchGeneration { NSDictionary *objA = nil; NSDictionary *objB = nil; NSArray *patches = nil; NSArray *expected = nil; objA = @{@"user": @{@"firstName": @"Albert", @"lastName": @"Einstein"}}; objB = @{@"user": @{@"firstName": @"Albert"}}; patches = [JSONPatch createPatchesComparingCollectionsOld:objA toNew:objB]; expected = @[@{@"op": @"remove", @"path": @"/user/lastName"}]; }
-
-
JSON Pointer - IETF RFC6901: Reference and access values and objects within a hierarchical JSON structure using a concise path pattern notation. This functionality is based on Jonathan Dring's NSDictionary-CWJSONPointer.
-
Example:
#import "JSONTools.h" - (void)exampleJSONPointer { NSDictionary *obj = @{ @"data": @{ @"foo": @[@"bar", @"baz"], @"bork": @{ @"crud": @"stuff", @"guts": @"and things" } } }; NSString *result1 = [_obj valueForJSONPointer: @"/data/foo/1" ]; // Yields -> "baz" NSString *result2 = [_obj valueForJSONPointer: @"/data/bork/guts"]; // Yields -> "and things" NSDictionary *result3 = [_obj valueForJSONPointer: @"/data/bork"]; // Yields -> {"crud": "stuff","guts": "and things"} }
-
-
JSON Schema with Validation - IETF Draft v4, 2013. This functionality is based on Sam Duke's KiteJSONValidator but adds additional validations and tests for the JSON-Schema
format
parameter.-
Example #1:
{ "schema": { "type": "array", "items": { "$ref": "#/definitions/positiveInteger" }, "definitions": { "positiveInteger": { "type": "integer", "minimum": 0, "exclusiveMinimum": true } } }, "validData": [0, 1, 2, 3, 4, 5], "invalidData": [-12, "Abysmal", null, -141] }
/* Assuming that variables are assigned using JSON above: schema is an NSDictionary validData and invalidData are NSArrays */ BOOL success = NO; JSONSchemaValidator *validator = [JSONSchemaValidator new]; success = [validator validateJSONInstance:validData withSchema:schema]; // success == YES, All validData values are positive integers. success = [validator validateJSONInstance:invalidData withSchema:schema]; // success == NO, invalidData array isn't comprised of positive integers.
-
Example #2:
NSDictionary *schema = nil; id testData = nil; BOOL success = NO; JSONSchemaValidator *validator = [JSONSchemaValidator new]; validator.formatValidationEnabled = YES; schema = @{@"format": @"date-time"}; testData = @"2000-02-29T08:30:06.283185Z"; success = [validator validateJSONInstance:testData withSchema:schema]; // success == YES, February 2000 had 29 days. schema = @{@"format": @"ipv6"}; testData = @"12345::"; success = [validator validateJSONInstance:testData withSchema:schema]; // success == NO, the IPv6 address has out-of-range values.
-