From 66a123e21626a7e8ee45e50bbfb849d9ae93a623 Mon Sep 17 00:00:00 2001 From: Oliver Eikemeier Date: Tue, 20 Mar 2012 22:39:18 +0100 Subject: [PATCH 1/3] Use SBJsonParser/SBJsonWriter instead of NSObject+SBJson - SBJsonParser can be used standalone when JSON posting is not used - No NSString -> NSData conversion when encoding - Possibility to implement error handling (although [parser/writer error] returns a NSString...) - Documented interface: http://stig.github.com/json-framework/api/3.0/interfaceSBJsonParser.html http://stig.github.com/json-framework/api/3.0/interfaceSBJsonWriter.html --- AFNetworking/AFJSONUtilities.m | 37 +++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/AFNetworking/AFJSONUtilities.m b/AFNetworking/AFJSONUtilities.m index b7bb02f..af91e52 100644 --- a/AFNetworking/AFJSONUtilities.m +++ b/AFNetworking/AFJSONUtilities.m @@ -26,9 +26,11 @@ NSData * AFJSONEncode(id object, NSError **error) { NSData *data = nil; SEL _JSONKitSelector = NSSelectorFromString(@"JSONDataWithOptions:error:"); - SEL _SBJSONSelector = NSSelectorFromString(@"JSONRepresentation"); SEL _YAJLSelector = NSSelectorFromString(@"yajl_JSONString"); + id _SBJsonWriterClass = NSClassFromString(@"SBJsonWriter"); + SEL _SBJsonWriterSelector = NSSelectorFromString(@"dataWithObject:"); + id _NXJsonSerializerClass = NSClassFromString(@"NXJsonSerializer"); SEL _NXJsonSerializerSelector = NSSelectorFromString(@"serialize:"); @@ -54,16 +56,16 @@ NSData * AFJSONEncode(id object, NSError **error) { [invocation invoke]; [invocation getReturnValue:&data]; - } else if (_SBJSONSelector && [object respondsToSelector:_SBJSONSelector]) { - NSString *JSONString = nil; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[object methodSignatureForSelector:_SBJSONSelector]]; - invocation.target = object; - invocation.selector = _SBJSONSelector; + } else if (_SBJsonWriterClass && [_SBJsonWriterClass instancesRespondToSelector:_SBJsonWriterSelector]) { + id writer = [[_SBJsonWriterClass alloc] init]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[writer methodSignatureForSelector:_SBJsonWriterSelector]]; + invocation.target = writer; + invocation.selector = _SBJsonWriterSelector; + + [invocation setArgument:&object atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation [invocation invoke]; - [invocation getReturnValue:&JSONString]; - - data = [JSONString dataUsingEncoding:NSUTF8StringEncoding]; + [invocation getReturnValue:&data]; } else if (_YAJLSelector && [object respondsToSelector:_YAJLSelector]) { @try { NSString *JSONString = nil; @@ -119,9 +121,11 @@ id AFJSONDecode(NSData *data, NSError **error) { id JSON = nil; SEL _JSONKitSelector = NSSelectorFromString(@"objectFromJSONDataWithParseOptions:error:"); - SEL _SBJSONSelector = NSSelectorFromString(@"JSONValue"); SEL _YAJLSelector = NSSelectorFromString(@"yajl_JSONWithOptions:error:"); + id _SBJSONParserClass = NSClassFromString(@"SBJsonParser"); + SEL _SBJSONParserSelector = NSSelectorFromString(@"objectWithData:"); + id _NSJSONSerializationClass = NSClassFromString(@"NSJSONSerialization"); SEL _NSJSONSerializationSelector = NSSelectorFromString(@"JSONObjectWithData:options:error:"); @@ -148,13 +152,14 @@ id AFJSONDecode(NSData *data, NSError **error) { [invocation invoke]; [invocation getReturnValue:&JSON]; - } else if (_SBJSONSelector && [NSString instancesRespondToSelector:_SBJSONSelector]) { - // Create a string representation of JSON, to use SBJSON -`JSONValue` category method - NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[string methodSignatureForSelector:_SBJSONSelector]]; - invocation.target = string; - invocation.selector = _SBJSONSelector; + } else if (_SBJSONParserClass && [_SBJSONParserClass instancesRespondToSelector:_SBJSONParserSelector]) { + id parser = [[_SBJSONParserClass alloc] init]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[parser methodSignatureForSelector:_SBJSONParserSelector]]; + invocation.target = parser; + invocation.selector = _SBJSONParserSelector; + [invocation setArgument:&data atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation + [invocation invoke]; [invocation getReturnValue:&JSON]; } else if (_YAJLSelector && [data respondsToSelector:_YAJLSelector]) { From 32fb8171bf670ef2454bc7352921f5084e5d4f4d Mon Sep 17 00:00:00 2001 From: Oliver Eikemeier Date: Tue, 20 Mar 2012 22:54:27 +0100 Subject: [PATCH 2/3] AFNetworking is still non-ARC --- AFNetworking/AFJSONUtilities.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AFNetworking/AFJSONUtilities.m b/AFNetworking/AFJSONUtilities.m index af91e52..820d362 100644 --- a/AFNetworking/AFJSONUtilities.m +++ b/AFNetworking/AFJSONUtilities.m @@ -66,6 +66,7 @@ NSData * AFJSONEncode(id object, NSError **error) { [invocation invoke]; [invocation getReturnValue:&data]; + [writer release]; } else if (_YAJLSelector && [object respondsToSelector:_YAJLSelector]) { @try { NSString *JSONString = nil; @@ -162,6 +163,7 @@ id AFJSONDecode(NSData *data, NSError **error) { [invocation invoke]; [invocation getReturnValue:&JSON]; + [parser release]; } else if (_YAJLSelector && [data respondsToSelector:_YAJLSelector]) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[data methodSignatureForSelector:_YAJLSelector]]; invocation.target = data; From 371d6406ea2139e97f45094f7373aaabcababb35 Mon Sep 17 00:00:00 2001 From: Oliver Eikemeier Date: Wed, 21 Mar 2012 00:17:59 +0100 Subject: [PATCH 3/3] merged e87b3c1 --- AFNetworking/AFJSONUtilities.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AFNetworking/AFJSONUtilities.m b/AFNetworking/AFJSONUtilities.m index 820d362..3377fc4 100644 --- a/AFNetworking/AFJSONUtilities.m +++ b/AFNetworking/AFJSONUtilities.m @@ -148,7 +148,7 @@ id AFJSONDecode(NSData *data, NSError **error) { NSUInteger parseOptionFlags = 0; [invocation setArgument:&parseOptionFlags atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation if (error != NULL) { - [invocation setArgument:error atIndex:3]; + [invocation setArgument:&error atIndex:3]; } [invocation invoke]; @@ -172,7 +172,7 @@ id AFJSONDecode(NSData *data, NSError **error) { NSUInteger yajlParserOptions = 0; [invocation setArgument:&yajlParserOptions atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation if (error != NULL) { - [invocation setArgument:error atIndex:3]; + [invocation setArgument:&error atIndex:3]; } [invocation invoke]; @@ -185,7 +185,7 @@ id AFJSONDecode(NSData *data, NSError **error) { [invocation setArgument:&data atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation if (error != NULL) { - [invocation setArgument:error atIndex:3]; + [invocation setArgument:&error atIndex:3]; } [invocation setArgument:&nullOption atIndex:4]; @@ -203,7 +203,7 @@ id AFJSONDecode(NSData *data, NSError **error) { NSUInteger readOptions = 0; [invocation setArgument:&readOptions atIndex:3]; if (error != NULL) { - [invocation setArgument:error atIndex:4]; + [invocation setArgument:&error atIndex:4]; } [invocation invoke];