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
This commit is contained in:
Oliver Eikemeier 2012-03-20 22:39:18 +01:00
parent c198eaf251
commit 66a123e216

View file

@ -26,9 +26,11 @@ NSData * AFJSONEncode(id object, NSError **error) {
NSData *data = nil; NSData *data = nil;
SEL _JSONKitSelector = NSSelectorFromString(@"JSONDataWithOptions:error:"); SEL _JSONKitSelector = NSSelectorFromString(@"JSONDataWithOptions:error:");
SEL _SBJSONSelector = NSSelectorFromString(@"JSONRepresentation");
SEL _YAJLSelector = NSSelectorFromString(@"yajl_JSONString"); SEL _YAJLSelector = NSSelectorFromString(@"yajl_JSONString");
id _SBJsonWriterClass = NSClassFromString(@"SBJsonWriter");
SEL _SBJsonWriterSelector = NSSelectorFromString(@"dataWithObject:");
id _NXJsonSerializerClass = NSClassFromString(@"NXJsonSerializer"); id _NXJsonSerializerClass = NSClassFromString(@"NXJsonSerializer");
SEL _NXJsonSerializerSelector = NSSelectorFromString(@"serialize:"); SEL _NXJsonSerializerSelector = NSSelectorFromString(@"serialize:");
@ -54,16 +56,16 @@ NSData * AFJSONEncode(id object, NSError **error) {
[invocation invoke]; [invocation invoke];
[invocation getReturnValue:&data]; [invocation getReturnValue:&data];
} else if (_SBJSONSelector && [object respondsToSelector:_SBJSONSelector]) { } else if (_SBJsonWriterClass && [_SBJsonWriterClass instancesRespondToSelector:_SBJsonWriterSelector]) {
NSString *JSONString = nil; id writer = [[_SBJsonWriterClass alloc] init];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[object methodSignatureForSelector:_SBJSONSelector]]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[writer methodSignatureForSelector:_SBJsonWriterSelector]];
invocation.target = object; invocation.target = writer;
invocation.selector = _SBJSONSelector; invocation.selector = _SBJsonWriterSelector;
[invocation setArgument:&object atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[invocation invoke]; [invocation invoke];
[invocation getReturnValue:&JSONString]; [invocation getReturnValue:&data];
data = [JSONString dataUsingEncoding:NSUTF8StringEncoding];
} else if (_YAJLSelector && [object respondsToSelector:_YAJLSelector]) { } else if (_YAJLSelector && [object respondsToSelector:_YAJLSelector]) {
@try { @try {
NSString *JSONString = nil; NSString *JSONString = nil;
@ -119,9 +121,11 @@ id AFJSONDecode(NSData *data, NSError **error) {
id JSON = nil; id JSON = nil;
SEL _JSONKitSelector = NSSelectorFromString(@"objectFromJSONDataWithParseOptions:error:"); SEL _JSONKitSelector = NSSelectorFromString(@"objectFromJSONDataWithParseOptions:error:");
SEL _SBJSONSelector = NSSelectorFromString(@"JSONValue");
SEL _YAJLSelector = NSSelectorFromString(@"yajl_JSONWithOptions:error:"); SEL _YAJLSelector = NSSelectorFromString(@"yajl_JSONWithOptions:error:");
id _SBJSONParserClass = NSClassFromString(@"SBJsonParser");
SEL _SBJSONParserSelector = NSSelectorFromString(@"objectWithData:");
id _NSJSONSerializationClass = NSClassFromString(@"NSJSONSerialization"); id _NSJSONSerializationClass = NSClassFromString(@"NSJSONSerialization");
SEL _NSJSONSerializationSelector = NSSelectorFromString(@"JSONObjectWithData:options:error:"); SEL _NSJSONSerializationSelector = NSSelectorFromString(@"JSONObjectWithData:options:error:");
@ -148,12 +152,13 @@ id AFJSONDecode(NSData *data, NSError **error) {
[invocation invoke]; [invocation invoke];
[invocation getReturnValue:&JSON]; [invocation getReturnValue:&JSON];
} else if (_SBJSONSelector && [NSString instancesRespondToSelector:_SBJSONSelector]) { } else if (_SBJSONParserClass && [_SBJSONParserClass instancesRespondToSelector:_SBJSONParserSelector]) {
// Create a string representation of JSON, to use SBJSON -`JSONValue` category method id parser = [[_SBJSONParserClass alloc] init];
NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[parser methodSignatureForSelector:_SBJSONParserSelector]];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[string methodSignatureForSelector:_SBJSONSelector]]; invocation.target = parser;
invocation.target = string; invocation.selector = _SBJSONParserSelector;
invocation.selector = _SBJSONSelector;
[invocation setArgument:&data atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[invocation invoke]; [invocation invoke];
[invocation getReturnValue:&JSON]; [invocation getReturnValue:&JSON];