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 }







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM