SBJson库解析(六)SBJsonParser
2012-02-20 14:46
302 查看
json解析器
实现在SBJsonParser.m文件中:
/** json转objc 解析json字符串和NSData对象 内部使用了SBJsonStreamParser类 */ @interface SBJsonParser : NSObject /** @最大递归深度,默认为32 如果嵌套的太深,大于32被视为恶意解析,返回nil,并发送一个错误信号 可以通过设置maxDepth为0,来取消此安全功能 */ @property NSUInteger maxDepth; /** @返回一个出错信息,如果没错误,返回为nil */ @property(copy) NSString *error; /** json转objc @返回给定的NSData所代表的对象 参数data必须为UTF8编码 返回NSArray或NSDictionary对象,如果返回nil,表示出现错误 */ - (id)objectWithData:(NSData*)data; /** json转objc @返回给定字符串所代表的对象 此方法内部实现是:把参数用UTF8编码成NSData,然后调用objectWithData:方法,转成NSArray或NSDictionary,或nil */ - (id)objectWithString:(NSString *)repr; /** json转objc @返回给定字符串所代表的对象 */ - (id)objectWithString:(NSString*)jsonText error:(NSError**)error; @end
实现在SBJsonParser.m文件中:
#import "SBJsonParser.h" #import "SBJsonStreamParser.h" #import "SBJsonStreamParserAdapter.h" #import "SBJsonStreamParserAccumulator.h" @implementation SBJsonParser @synthesize maxDepth; @synthesize error; - (id)init { self = [super init]; if (self) self.maxDepth = 32u; return self; } #pragma mark Methods /** 调用流解析器SBJsonStreamParser的parse:方法,把NSData转成NSArray或NSDictionary对象 */ - (id)objectWithData:(NSData *)data { if (!data) { self.error = @"Input was 'nil'"; return nil; } //初始化一个json流解析叠加器 SBJsonStreamParserAccumulator *accumulator = [[SBJsonStreamParserAccumulator alloc] init]; //初始化一个json流解析配置器 SBJsonStreamParserAdapter *adapter = [[SBJsonStreamParserAdapter alloc] init]; //把叠加器设为配置器的代理(delegate) adapter.delegate = accumulator; //初始化一个json流解析器,设置参数 SBJsonStreamParser *parser = [[SBJsonStreamParser alloc] init]; parser.maxDepth = self.maxDepth; //把配置器设为解析器的代理(delegate) parser.delegate = adapter; switch ([parser parse:data]) { case SBJsonStreamParserComplete: return accumulator.value; break; case SBJsonStreamParserWaitingForData: self.error = @"Unexpected end of input"; break; case SBJsonStreamParserError: self.error = parser.error; break; } return nil; } //NSString用UTF8编码成NSData,再把NSData转成NSArray或NSDictionary对象 - (id)objectWithString:(NSString *)repr { return [self objectWithData:[repr dataUsingEncoding:NSUTF8StringEncoding]]; } - (id)objectWithString:(NSString*)repr error:(NSError**)error_ { id tmp = [self objectWithString:repr]; if (tmp) return tmp; if (error_) { NSDictionary *ui = [NSDictionary dictionaryWithObjectsAndKeys:error, NSLocalizedDescriptionKey, nil]; *error_ = [NSError errorWithDomain:@"org.brautaset.SBJsonParser.ErrorDomain" code:0 userInfo:ui]; } return nil; } @end
相关文章推荐
- SBJson库解析(十)SBJsonStreamParserAccumulator
- iOS SBJson网络解析
- IOS中四种解析JSON的方法(IOS5自带支持方法、JSONKit、SBJson、TouchJson)
- iOS SBJSON解析错误 Unescaped control character [0x09]
- iOS json解析之SBJson
- sbjson数据的生成和解析
- sbjson数据的生成和解析
- SBJson 框架使用2 SBJson解析数据 解析字典,数组
- xcode4.2.1 中使用 sbjson 的 3.1版本来解析json字符串
- SBJson库解析(四)SBJsonStreamWriter
- iOS Xcode7.2开发时使用SBJson解析时 出现野指针的问题解决
- iOS 使用SBJSON创建和解析JSON
- iOS 使用SBJSON创建和解析JSON
- iphone 之SBJson 解析
- sbjson解析出的json字符串包含null时的处理方法
- JSON之解析通过TouchJSON\SBJSON\JSONKit\NSJSONSeriliz...
- SBJson库解析(五)SBJsonStreamWriterAccumulator
- ios开发之解析json字符串(SBJson)
- ASIHttpRequest+SBJson完成Http请求,以及json数据解析
- iOS巅峰之SBJSON解析