SBJson库解析(三)SBJsonWriter

SBJsonWriter:json编写器类

内部使用了json流编写器:SBJsonStreamWriter类,和json流编写累加器:SBJsonStreamWriterAccumulator类

主要有4个属性:

 1 /**
2 @最大递归深度,默认为32
3 如果嵌套的太深,大于32被视为恶意解析,返回nil,并发送一个错误信号
4 可以通过设置maxDepth为0,来取消此安全功能
5 */
6 @property NSUInteger maxDepth;
7
8 /**
9 @返回一个出错信息,如果没错误,返回为nil
10 */
11 @property (readonly, copy) NSString *error;
12
13 /**
14 @是否为人类可读的json
15 默认为NO,产生的json没有任何空白
16 如果设为YES,换行后,每个数组值和字典键/值对缩进两个空格
17 */
18 @property BOOL humanReadable;
19
20 /**
21 @输出时字典键是否排序
22 默认为NO,如果设为YES,排序json输出的字典键
23 如果你需要比较两个结构时候很有用
24 */
25 @property BOOL sortKeys;

注意:上面的error属性为只读的(readonly)

属性实现在SBJsonWriter.m文件中:

1 @synthesize sortKeys;
2 @synthesize humanReadable;
3 @synthesize error;
4 @synthesize maxDepth;

其中error通过类别声明为私有可写,如下:

1 @interface SBJsonWriter ()
2 @property (copy) NSString *error;
3 @end

 

此类有3个转json表述的方法:

 1 /**
2 @objc转成NSString
3 返回给定objc对象的json表示
4 返回一个字符串,或nil
5 如果返回nil,则SBJsonWriter的error属性不为空,可以通过error的信息知道出错原因
6 其中的参数value,是任何可以用json表述的对象
7 */
8 - (NSString*)stringWithObject:(id)value;
9
10 /**
11 @objc转成NSData
12 返回给定objc对象的json表示,用UTF8编码
13 返回一个NSData对象,或nil
14 */
15 - (NSData*)dataWithObject:(id)value;
16
17 /**
18 @返回给定objc对象的json表示(或片段)
19 返回字符串,或nil
20 */
21 - (NSString*)stringWithObject:(id)value
22 error:(NSError**)error;


三个方法的具体实现在SBJsonWriter.m文件中

 1 //把objc转成NSData,再通过UTF8编码把NSData转成字符串
2 - (NSString*)stringWithObject:(id)value {
3 NSData *data = [self dataWithObject:value];
4 if (data)
5 return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
6 return nil;
7 }
8
9 - (NSString*)stringWithObject:(id)value error:(NSError**)error_ {
10 NSString *tmp = [self stringWithObject:value];
11 if (tmp)
12 return tmp;
13
14 if (error_) {
15 NSDictionary *ui = [NSDictionary dictionaryWithObjectsAndKeys:error, NSLocalizedDescriptionKey, nil];
16 *error_ = [NSError errorWithDomain:@"org.brautaset.SBJsonWriter.ErrorDomain" code:0 userInfo:ui];
17 }
18
19 return nil;
20 }
21
22 /**
23 初始化一个json流编写器,设置参数
24 初始化一个json流编写叠加器,把它设为SBJsonStreamWriter的代理(delegate)
25 把ojbc对象转变为NSData,通过调用SBJsonStreamWriter的writeObject:方法,或writeArray:方法,
26 或递归调用dataWithObject:方法,参数为[object proxyForJson]返回的代理对象
27 其中SBJsonStreamWriter的各种write方法,是把基本数据写成二进制bytes
28 然后通过叠加器SBJsonStreamWriterAccumulator,把二进制bytes拼装成NSData对象
29 返回叠加器的data属性变量
30 */
31 - (NSData*)dataWithObject:(id)object {
32 self.error = nil;
33
34 SBJsonStreamWriterAccumulator *accumulator = [[SBJsonStreamWriterAccumulator alloc] init];
35
36 SBJsonStreamWriter *streamWriter = [[SBJsonStreamWriter alloc] init];
37 streamWriter.sortKeys = self.sortKeys;
38 streamWriter.maxDepth = self.maxDepth;
39 streamWriter.humanReadable = self.humanReadable;
40 streamWriter.delegate = accumulator;
41
42 BOOL ok = NO;
43 if ([object isKindOfClass:[NSDictionary class]])
44 ok = [streamWriter writeObject:object];
45
46 else if ([object isKindOfClass:[NSArray class]])
47 ok = [streamWriter writeArray:object];
48
49 else if ([object respondsToSelector:@selector(proxyForJson)])
50 return [self dataWithObject:[object proxyForJson]];
51 else {
52 self.error = @"Not valid type for JSON";
53 return nil;
54 }
55
56 if (ok)
57 return accumulator.data;
58
59 self.error = streamWriter.error;
60 return nil;
61 }






posted @ 2012-02-17 17:49  月光的尽头  阅读(4033)  评论(0编辑  收藏  举报