Неожиданный конец ввода с SBJson в Objective-C - PullRequest
1 голос
/ 02 августа 2011

У меня есть следующий код, который пытается проанализировать JSON, который я возвращаю с веб-сайта:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

     [connection release];

     NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

     NSLog(@"my ns string = %@", responseString);

     [responseData release];

     NSError *error; 
     NSDictionary *dictionary = [parser objectWithString:responseString   
                                               error:&error]; 
     while (error) { 
         NSLog(@"%@", error); 
         error = [[error userInfo] objectForKey:NSUnderlyingErrorKey]; 
     } 

     NSLog(@"%@", dictionary);


 }

Я получаю эти ошибки:

2011-08-01 20:16:47.273 myJSONParser[1040:b603] Connection didReceiveResponse: 
<NSHTTPURLResponse: 0x4e810f0> - application/json
2011-08-01 20:16:47.279 myJSONParser[1040:b603] Connection didReceiveData of length: 117
2011-08-01 20:16:47.359 myJSONParser[1040:b603] my ns string = 
2011-08-01 20:16:47.361 myJSONParser[1040:b603] Error Domain=org.brautaset.SBJsonParser.ErrorDomain Code=0 "Unexpected end of input" UserInfo=0x4eada30 {NSLocalizedDescription=Unexpected end of input}
2011-08-01 20:16:47.363 myJSONParser[1040:b603] (null)

У меня есть контрольповерх JSON, который я пытаюсь получить, и внутри PHP, который генерирует JSON, я устанавливаю заголовок следующим образом:

header("Content-Type:application/json");
...
echo json_encode($arr);

«Неожиданный конец ввода» приводит меня к мысли, что JSON каким-то образом искажен,но JSONLint говорит мне, что это совершенно правильно.Что я делаю неправильно?Спасибо, что нашли время, чтобы прочитать это, любой совет будет очень признателен!

ОБНОВЛЕНИЕ:

Я установил responseData следующим образом:

NSMutableData *responseData;

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
         NSLog(@"Connection didReceiveData of length: %u", data.length);

         [responseData appendData:data];

     }

Ипарсер вот так (в .ч):

SBJsonParser *parser;

и .m:

parser = [[SBJsonParser alloc] init];

Чарльз Выводы:

HTTP/1.1 200 OK
Date: Tue, 02 Aug 2011 03:30:14 GMT
Server: Apache
X-Powered-By: PHP/5.2.15
Transfer-Encoding: chunked
Content-Type: application/json

[{"key1":"Name","key2":"First","key3":"2011-08-13"},{"key1":"Second","key2":"test2","key3":"2011-08-13"}]

Описание полученных NSData:

Печать описания данных: {длина = 117, емкость = 256, байт = 0x5b7b22686f6d65223a22426c61636b62 ... 30382d3133227d5d}

1 Ответ

1 голос
/ 02 августа 2011

Начиная с кода , похоже, что мы получаем "неожиданный конец ввода" только при обнаружении токена EOF.

SBJsonParser.m:

case SBJsonStreamParserWaitingForData:
            self.error = @"Unexpected end of input";
            break;

SBJsonStreamParserState.m:

- (SBJsonStreamParserStatus)parserShouldReturn:(SBJsonStreamParser*)parser {
    return SBJsonStreamParserWaitingForData;
}

SBJsonStreamParser.m:

    switch (tok) {
        case sbjson_token_eof:
            return [state parserShouldReturn:self];
            break;
    ... }

Ваши журналы, кажется, указывают, что что-то не так с NSString. Я бы проверил данные ответа, чтобы убедиться, что они правильные - вы можете сделать это с помощью прокси-сервера, такого как Fiddler или Charles, отладчик xcode или просто старый NSLog ().

Edit:

Хорошо, я преобразовал данные, полученные от отладчика, в UTF-8, и вот что я получил:

[{"home":"Blackb ... 08-13"}]

Вы вставили только частичный бит массива байтов, поэтому там должно быть больше места, где находится многоточие. «Дом» или «черный» что-нибудь значат для вас? В данных ответа Чарльза ничего не было. Делаете ли вы setLength: 0 для responseData в методе делегата didReceiveReponse?

...