您的位置:首页 > Web前端 > JavaScript

SBJson库解析(六)SBJsonParser

2012-02-20 14:46 302 查看
json解析器

/**
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: