Прерывистый сбой анализатора JSON для неэкранированного управляющего символа - PullRequest
2 голосов
/ 21 декабря 2010

Функциональность в приложении для iPhone, которое ищет в твиттере какой-то текст.Код очень прост, я передаю строку URL-адреса в твиттер-API, а затем анализирую результат.Хотя половину времени анализатор JSON завершается с ошибкой для неуправляемого управляющего символа '0x0'.Код и полное сообщение об ошибке ниже.

    - (void)grabData:(NSString *)searchTerm {
     NSString *urlString = [NSString stringWithFormat:@"http://search.twitter.com/search.json?q=%@&rpp=25",searchTerm];

     NSURL *url = [NSURL URLWithString:urlString];

     NSLog(@"Created url:%@",url);

     //Setup and start async download
     NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
     NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
     [connection release];
     [request release];
    }

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

     // Store incoming data into a string
     NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

     //NSLog(@"Did receive some data %@",jsonString);

     //Create a dictionary from the JSON string
     NSDictionary *results = [jsonString JSONValue];

     // Build an Array from the dictionary for easy access to each entry
     NSDictionary *tweets = [results objectForKey:@"results"];

            // Loop through each entry in the dictionary
    for(NSDictionary *tweet in tweets) {
     // Get the user string for the tweet
     NSString *tUser = [tweet objectForKey:@"from_user"];
           NSLog(@"Tweet from %@",tUser);
          }

    }

Сообщение об ошибке с консоли, 50% времени, остальные 50% работает как положено.

1 Ответ

3 голосов
/ 21 декабря 2010

Метод didReceiveData может вызываться несколько раз при доставке данных. Таким образом, в этом методе вы должны просто добавить каждый входящий блок в переменную класса NSMutableData (не обрабатывать ее).

Обработка полных данных должна выполняться методом connectionDidFinishLoading.

Ошибка, вероятно, происходит, потому что она пытается проанализировать частичный блок данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...