Statistics
| Branch: | Revision:

root / json-framework-3.2.0 / Classes / SBJsonParser.m @ 3ebe9884

History | View | Annotate | Download (3.2 kB)

1 3ebe9884 Miltiadis Vasilakis
/*
2 3ebe9884 Miltiadis Vasilakis
 Copyright (C) 2009,2010 Stig Brautaset. All rights reserved.
3 3ebe9884 Miltiadis Vasilakis
 
4 3ebe9884 Miltiadis Vasilakis
 Redistribution and use in source and binary forms, with or without
5 3ebe9884 Miltiadis Vasilakis
 modification, are permitted provided that the following conditions are met:
6 3ebe9884 Miltiadis Vasilakis
 
7 3ebe9884 Miltiadis Vasilakis
 * Redistributions of source code must retain the above copyright notice, this
8 3ebe9884 Miltiadis Vasilakis
   list of conditions and the following disclaimer.
9 3ebe9884 Miltiadis Vasilakis
 
10 3ebe9884 Miltiadis Vasilakis
 * Redistributions in binary form must reproduce the above copyright notice,
11 3ebe9884 Miltiadis Vasilakis
   this list of conditions and the following disclaimer in the documentation
12 3ebe9884 Miltiadis Vasilakis
   and/or other materials provided with the distribution.
13 3ebe9884 Miltiadis Vasilakis
 
14 3ebe9884 Miltiadis Vasilakis
 * Neither the name of the author nor the names of its contributors may be used
15 3ebe9884 Miltiadis Vasilakis
   to endorse or promote products derived from this software without specific
16 3ebe9884 Miltiadis Vasilakis
   prior written permission.
17 3ebe9884 Miltiadis Vasilakis
 
18 3ebe9884 Miltiadis Vasilakis
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 3ebe9884 Miltiadis Vasilakis
 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 3ebe9884 Miltiadis Vasilakis
 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 3ebe9884 Miltiadis Vasilakis
 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
22 3ebe9884 Miltiadis Vasilakis
 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 3ebe9884 Miltiadis Vasilakis
 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 3ebe9884 Miltiadis Vasilakis
 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 3ebe9884 Miltiadis Vasilakis
 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 3ebe9884 Miltiadis Vasilakis
 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 3ebe9884 Miltiadis Vasilakis
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 3ebe9884 Miltiadis Vasilakis
 */
29 3ebe9884 Miltiadis Vasilakis
30 3ebe9884 Miltiadis Vasilakis
#if !__has_feature(objc_arc)
31 3ebe9884 Miltiadis Vasilakis
#error "This source file must be compiled with ARC enabled!"
32 3ebe9884 Miltiadis Vasilakis
#endif
33 3ebe9884 Miltiadis Vasilakis
34 3ebe9884 Miltiadis Vasilakis
#import "SBJsonParser.h"
35 3ebe9884 Miltiadis Vasilakis
#import "SBJsonStreamParser.h"
36 3ebe9884 Miltiadis Vasilakis
#import "SBJsonStreamParserAdapter.h"
37 3ebe9884 Miltiadis Vasilakis
#import "SBJsonStreamParserAccumulator.h"
38 3ebe9884 Miltiadis Vasilakis
39 3ebe9884 Miltiadis Vasilakis
@implementation SBJsonParser
40 3ebe9884 Miltiadis Vasilakis
41 3ebe9884 Miltiadis Vasilakis
@synthesize maxDepth;
42 3ebe9884 Miltiadis Vasilakis
@synthesize error;
43 3ebe9884 Miltiadis Vasilakis
44 3ebe9884 Miltiadis Vasilakis
- (id)init {
45 3ebe9884 Miltiadis Vasilakis
    self = [super init];
46 3ebe9884 Miltiadis Vasilakis
    if (self)
47 3ebe9884 Miltiadis Vasilakis
        self.maxDepth = 32u;
48 3ebe9884 Miltiadis Vasilakis
    return self;
49 3ebe9884 Miltiadis Vasilakis
}
50 3ebe9884 Miltiadis Vasilakis
51 3ebe9884 Miltiadis Vasilakis
52 3ebe9884 Miltiadis Vasilakis
#pragma mark Methods
53 3ebe9884 Miltiadis Vasilakis
54 3ebe9884 Miltiadis Vasilakis
- (id)objectWithData:(NSData *)data {
55 3ebe9884 Miltiadis Vasilakis
56 3ebe9884 Miltiadis Vasilakis
    if (!data) {
57 3ebe9884 Miltiadis Vasilakis
        self.error = @"Input was 'nil'";
58 3ebe9884 Miltiadis Vasilakis
        return nil;
59 3ebe9884 Miltiadis Vasilakis
    }
60 3ebe9884 Miltiadis Vasilakis
61 3ebe9884 Miltiadis Vasilakis
	SBJsonStreamParserAccumulator *accumulator = [[SBJsonStreamParserAccumulator alloc] init];
62 3ebe9884 Miltiadis Vasilakis
    
63 3ebe9884 Miltiadis Vasilakis
    SBJsonStreamParserAdapter *adapter = [[SBJsonStreamParserAdapter alloc] init];
64 3ebe9884 Miltiadis Vasilakis
    adapter.delegate = accumulator;
65 3ebe9884 Miltiadis Vasilakis
	
66 3ebe9884 Miltiadis Vasilakis
	SBJsonStreamParser *parser = [[SBJsonStreamParser alloc] init];
67 3ebe9884 Miltiadis Vasilakis
	parser.maxDepth = self.maxDepth;
68 3ebe9884 Miltiadis Vasilakis
	parser.delegate = adapter;
69 3ebe9884 Miltiadis Vasilakis
	
70 3ebe9884 Miltiadis Vasilakis
	switch ([parser parse:data]) {
71 3ebe9884 Miltiadis Vasilakis
		case SBJsonStreamParserComplete:
72 3ebe9884 Miltiadis Vasilakis
            return accumulator.value;
73 3ebe9884 Miltiadis Vasilakis
			break;
74 3ebe9884 Miltiadis Vasilakis
			
75 3ebe9884 Miltiadis Vasilakis
		case SBJsonStreamParserWaitingForData:
76 3ebe9884 Miltiadis Vasilakis
		    self.error = @"Unexpected end of input";
77 3ebe9884 Miltiadis Vasilakis
			break;
78 3ebe9884 Miltiadis Vasilakis
79 3ebe9884 Miltiadis Vasilakis
		case SBJsonStreamParserError:
80 3ebe9884 Miltiadis Vasilakis
		    self.error = parser.error;
81 3ebe9884 Miltiadis Vasilakis
			break;
82 3ebe9884 Miltiadis Vasilakis
	}
83 3ebe9884 Miltiadis Vasilakis
	
84 3ebe9884 Miltiadis Vasilakis
	return nil;
85 3ebe9884 Miltiadis Vasilakis
}
86 3ebe9884 Miltiadis Vasilakis
87 3ebe9884 Miltiadis Vasilakis
- (id)objectWithString:(NSString *)repr {
88 3ebe9884 Miltiadis Vasilakis
	return [self objectWithData:[repr dataUsingEncoding:NSUTF8StringEncoding]];
89 3ebe9884 Miltiadis Vasilakis
}
90 3ebe9884 Miltiadis Vasilakis
91 3ebe9884 Miltiadis Vasilakis
- (id)objectWithString:(NSString*)repr error:(NSError**)error_ {
92 3ebe9884 Miltiadis Vasilakis
	id tmp = [self objectWithString:repr];
93 3ebe9884 Miltiadis Vasilakis
    if (tmp)
94 3ebe9884 Miltiadis Vasilakis
        return tmp;
95 3ebe9884 Miltiadis Vasilakis
    
96 3ebe9884 Miltiadis Vasilakis
    if (error_) {
97 3ebe9884 Miltiadis Vasilakis
		NSDictionary *ui = [NSDictionary dictionaryWithObjectsAndKeys:error, NSLocalizedDescriptionKey, nil];
98 3ebe9884 Miltiadis Vasilakis
        *error_ = [NSError errorWithDomain:@"org.brautaset.SBJsonParser.ErrorDomain" code:0 userInfo:ui];
99 3ebe9884 Miltiadis Vasilakis
	}
100 3ebe9884 Miltiadis Vasilakis
	
101 3ebe9884 Miltiadis Vasilakis
    return nil;
102 3ebe9884 Miltiadis Vasilakis
}
103 3ebe9884 Miltiadis Vasilakis
104 3ebe9884 Miltiadis Vasilakis
@end