SBJson库解析(八)SBJsonStreamParserAdapter

json流解析配置器

1.定义了一个枚举配置器类型:

1 typedef enum {
2 SBJsonStreamParserAdapterNone,
3 SBJsonStreamParserAdapterArray,
4 SBJsonStreamParserAdapterObject,
5 } SBJsonStreamParserAdapterType;

2.定义了一个json流解析配置器代理协议:

 1 /**
2 @json流解析配置器代理协议
3 从流解析配置器获得obj或array对象的代理
4 由流解析叠加器SBJsonStreamParserAccumulator实现
5 */
6 @protocol SBJsonStreamParserAdapterDelegate
7
8 /**
9 如果发现一个json数组,则调用此方法
10 */
11 - (void)parser:(SBJsonStreamParser*)parser foundArray:(NSArray*)array;
12
13 /**
14 如果发现一个json对象,则调用此方法
15 */
16 - (void)parser:(SBJsonStreamParser*)parser foundObject:(NSDictionary*)dict;
17
18 @end

3.类定义和属性:

 1 @interface SBJsonStreamParserAdapter : NSObject <SBJsonStreamParserDelegate> {
2 @private
3 NSUInteger depth;
4 NSMutableArray *array;
5 NSMutableDictionary *dict;
6 NSMutableArray *keyStack;
7 NSMutableArray *stack;
8
9 SBJsonStreamParserAdapterType currentType;
10 }
11
12 /**
13 如何跳过多个层级
14 当文件太大了或链接缓慢,此方法相当有用
15 如果设置此为N,它会跳过外面的N层,为每个内层对象,直接调用-parser:foundArray:或-parser:foundObject:方法
16 */
17 @property NSUInteger levelsToSkip;
18
19 /**
20 实现SBJsonStreamParserAdapterDelegate代理协议的对象
21 */
22 @property (unsafe_unretained) id<SBJsonStreamParserAdapterDelegate> delegate;
23
24 @end

/**

 默认的委托,当一个文件完全解析,只会调用一个-parser:foundArray:方法或-parser:foundObject:的方法

 如果设置SBJsonStreamParsersupportMultipleDocuments属性为YES,

 就可以支持多个json顶级对象的解析

 例子如下:

 

 @code

 SBJsonStreamParserAdapter *adapter = [[[SBJsonStreamParserAdapter alloc] init] autorelease];

 adapter.delegate = self;

 

 SBJsonStreamParser *parser = [[[SBJsonStreamParser alloc] init] autorelease];

 parser.delegate = adapter;

 parser.supportMultipleDocuments = YES;

 

 // 注意:此输入包含多个顶级json对象

 NSData *json = [@"[]{}[]{}" dataWithEncoding:NSUTF8StringEncoding]; 

 [parser parse:data];

 @endcode

 

 self调用它的顺序如下:

 @li -parser:foundArray:

 @li -parser:foundObject:

 @li -parser:foundArray:

 @li -parser:foundObject:

 

 下面是跳过第一个或多个封装对象:

 

 @code

 SBJsonStreamParserAdapter *adapter = [[[SBJsonStreamParserAdapter alloc] init] autorelease];

 adapter.delegate = self;

 adapter.levelsToSkip = 1;

 

 SBJsonStreamParser *parser = [[[SBJsonStreamParser alloc] init] autorelease];

 parser.delegate = adapter;

 

 // 注意:此输入包含一个单一的顶级json对象

 NSData *json = [@"[[],{},[],{}]" dataWithEncoding:NSUTF8StringEncoding]; 

 [parser parse:data];

 @endcode

*/




posted @ 2012-02-20 16:39  月光的尽头  阅读(869)  评论(0)    收藏  举报