diff --git a/Classes/SBJsonStreamParser.m b/Classes/SBJsonStreamParser.m index 8fb32b8c..569abbde 100644 --- a/Classes/SBJsonStreamParser.m +++ b/Classes/SBJsonStreamParser.m @@ -134,6 +134,13 @@ - (void)handleObjectStart { self.state = [SBJsonStreamParserStateObjectStart sharedInstance]; } +- (void)handleObjectEnd: (sbjson_token_t) tok { + self.state = [stateStack lastObject]; + [stateStack removeLastObject]; + [state parser:self shouldTransitionTo:tok]; + [delegate parserFoundObjectEnd:self]; +} + - (void)handleArrayStart { if (stateStack.count >= maxDepth) { [self maxDepthError]; @@ -145,10 +152,24 @@ - (void)handleArrayStart { self.state = [SBJsonStreamParserStateArrayStart sharedInstance]; } +- (void)handleArrayEnd: (sbjson_token_t) tok { + self.state = [stateStack lastObject]; + [stateStack removeLastObject]; + [state parser:self shouldTransitionTo:tok]; + [delegate parserFoundArrayEnd:self]; +} + +- (void) handleTokenNotExpectedHere: (sbjson_token_t) tok { + NSString *tokenName = [self tokenName:tok]; + NSString *stateName = [state name]; + + self.error = [NSString stringWithFormat:@"Token '%@' not expected %@", tokenName, stateName]; + self.state = [SBJsonStreamParserStateError sharedInstance]; +} + - (SBJsonStreamParserStatus)parse:(NSData *)data_ { [tokeniser appendData:data_]; - for (;;) { if ([state isKindOfClass:[SBJsonStreamParserStateError class]]) @@ -170,11 +191,7 @@ - (SBJsonStreamParserStatus)parse:(NSData *)data_ { default: if (![state parser:self shouldAcceptToken:tok]) { - NSString *tokenName = [self tokenName:tok]; - NSString *stateName = [state name]; - - self.error = [NSString stringWithFormat:@"Token '%@' not expected %@", tokenName, stateName]; - self.state = [SBJsonStreamParserStateError sharedInstance]; + [self handleTokenNotExpectedHere: tok]; return SBJsonStreamParserError; } @@ -184,10 +201,7 @@ - (SBJsonStreamParserStatus)parse:(NSData *)data_ { break; case sbjson_token_object_end: - self.state = [stateStack lastObject]; - [stateStack removeLastObject]; - [state parser:self shouldTransitionTo:tok]; - [delegate parserFoundObjectEnd:self]; + [self handleObjectEnd: tok]; break; case sbjson_token_array_start: @@ -195,10 +209,7 @@ - (SBJsonStreamParserStatus)parse:(NSData *)data_ { break; case sbjson_token_array_end: - self.state = [stateStack lastObject]; - [stateStack removeLastObject]; - [state parser:self shouldTransitionTo:tok]; - [delegate parserFoundArrayEnd:self]; + [self handleArrayEnd: tok]; break; case sbjson_token_separator: