SBJson库解析(六)SBJsonParser

json解析器

 1 /**
2 json转objc
3 解析json字符串和NSData对象
4 内部使用了SBJsonStreamParser类
5 */
6
7 @interface SBJsonParser : NSObject
8
9 /**
10 @最大递归深度,默认为32
11 如果嵌套的太深,大于32被视为恶意解析,返回nil,并发送一个错误信号
12 可以通过设置maxDepth为0,来取消此安全功能
13 */
14 @property NSUInteger maxDepth;
15
16 /**
17 @返回一个出错信息,如果没错误,返回为nil
18 */
19 @property(copy) NSString *error;
20
21 /**
22 json转objc
23 @返回给定的NSData所代表的对象
24 参数data必须为UTF8编码
25 返回NSArray或NSDictionary对象,如果返回nil,表示出现错误
26 */
27 - (id)objectWithData:(NSData*)data;
28
29 /**
30 json转objc
31 @返回给定字符串所代表的对象
32 此方法内部实现是:把参数用UTF8编码成NSData,然后调用objectWithData:方法,转成NSArray或NSDictionary,或nil
33 */
34 - (id)objectWithString:(NSString *)repr;
35
36 /**
37 json转objc
38 @返回给定字符串所代表的对象
39 */
40
41 - (id)objectWithString:(NSString*)jsonText
42 error:(NSError**)error;
43
44 @end

实现在SBJsonParser.m文件中:

 1 #import "SBJsonParser.h"
2 #import "SBJsonStreamParser.h"
3 #import "SBJsonStreamParserAdapter.h"
4 #import "SBJsonStreamParserAccumulator.h"
5
6 @implementation SBJsonParser
7
8 @synthesize maxDepth;
9 @synthesize error;
10
11 - (id)init {
12 self = [super init];
13 if (self)
14 self.maxDepth = 32u;
15 return self;
16 }
17
18 #pragma mark Methods
19
20 /**
21 调用流解析器SBJsonStreamParser的parse:方法,把NSData转成NSArray或NSDictionary对象
22 */
23 - (id)objectWithData:(NSData *)data {
24
25 if (!data) {
26 self.error = @"Input was 'nil'";
27 return nil;
28 }
29
30 //初始化一个json流解析叠加器
31 SBJsonStreamParserAccumulator *accumulator = [[SBJsonStreamParserAccumulator alloc] init];
32
33 //初始化一个json流解析配置器
34 SBJsonStreamParserAdapter *adapter = [[SBJsonStreamParserAdapter alloc] init];
35 //把叠加器设为配置器的代理(delegate)
36 adapter.delegate = accumulator;
37
38 //初始化一个json流解析器,设置参数
39 SBJsonStreamParser *parser = [[SBJsonStreamParser alloc] init];
40 parser.maxDepth = self.maxDepth;
41 //把配置器设为解析器的代理(delegate)
42 parser.delegate = adapter;
43
44 switch ([parser parse:data]) {
45 case SBJsonStreamParserComplete:
46 return accumulator.value;
47 break;
48
49 case SBJsonStreamParserWaitingForData:
50 self.error = @"Unexpected end of input";
51 break;
52
53 case SBJsonStreamParserError:
54 self.error = parser.error;
55 break;
56 }
57
58 return nil;
59 }
60
61 //NSString用UTF8编码成NSData,再把NSData转成NSArray或NSDictionary对象
62 - (id)objectWithString:(NSString *)repr {
63 return [self objectWithData:[repr dataUsingEncoding:NSUTF8StringEncoding]];
64 }
65
66 - (id)objectWithString:(NSString*)repr error:(NSError**)error_ {
67 id tmp = [self objectWithString:repr];
68 if (tmp)
69 return tmp;
70
71 if (error_) {
72 NSDictionary *ui = [NSDictionary dictionaryWithObjectsAndKeys:error, NSLocalizedDescriptionKey, nil];
73 *error_ = [NSError errorWithDomain:@"org.brautaset.SBJsonParser.ErrorDomain" code:0 userInfo:ui];
74 }
75
76 return nil;
77 }
78
79 @end




posted @ 2012-02-20 14:46  月光的尽头  阅读(6988)  评论(0编辑  收藏  举报