Подтвердить что ты не робот

Результаты анализа iOS 5 JSON в Cocoa Ошибка 3840

Мне сложно разбор строки ниже JSON на iOS 5.

{"States": [{"Name": "Arizona","Cities": [{"Name": "Phoenix"}]},{"Name": "California","Cities": [{"Name": "Orange County"},{"Name": "Riverside"},{"Name": "San Diego"},{"Name": "San Francisco"}]},{"Name": "Nevada","Cities": [{"Name": "Las Vegas"}]}]}

И вот мой код:

- (void) parseJson {
NSError *jsonError = nil;
NSData *jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Locations-JSON" ofType:@"rtf"]];

if (jsonData) {
    NSDictionary *jsonObjects = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonError];

    if (jsonError) {
        NSLog(@"JSON Error: %@", [jsonError localizedDescription]);

        return;
    }

    NSLog(@"%@", jsonObjects);
}
}

Я продолжаю получать эту ошибку:

JSON Error: The operation couldn’t be completed. (Cocoa error 3840.)

Я был бы признателен за помощь в этом, потому что я четко и неспособен исправить это.

4b9b3361

Ответ 1

Одна вещь, которая кажется мне неправильной, такова:

[[NSBundle mainBundle] pathForResource:@"Locations-JSON" ofType:@"rtf"]

Ваши данные - RTF файл? Это должен быть файл txt (или любой другой вид текстового файла). Файлы RTF обычно содержат данные форматирования текста, например:

{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural

\f0\fs24 \cf0 \{"States": [\{"Name": "Arizona","Cities": [\{"Name": "Phoenix"\}]\},\{"Name": "California","Cities": [\{"Name": "Orange County"\},\{"Name": "Riverside"\},\{"Name": "San Diego"\},\{"Name": "San Francisco"\}]\},\{"Name": "Nevada","Cities": [\{"Name": "Las Vegas"\}]\}]\}}

Когда я прочитал это как данные и попытаюсь разобрать его как JSON, я получаю ошибку 3840, которую вы видите. В этом описании ошибки говорится:

Данные не могут быть прочитаны, потому что они повреждены. (Нет строкового ключа для значения в объекте вокруг символа 2.)

Так что мне кажется, что у вас на самом деле нет JSON. У вас есть данные RTF.

Ответ 2

Я столкнулся с подобной проблемой. Мой парсер JSON работает с перерывами при загрузке данных JSON с сервера. Получали ли вы данные JSON из этой функции?

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

NSData, возвращаемые из этой функции, могут быть частичными данными. Вам нужно добавить appendData к переменной экземпляра с типом: NSMutableData. Затем вы обрабатываете JSON в другой функции следующим образом:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

Чтение этой статьи для деталей. Это работает для меня

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

Ответ 3

Я смог устранить ошибку JSON 3840, преобразов объект NSData в NSString:

NSError *error;

NSObject *object = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

if (object == nil) {
    NSString *serverResponse = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];

    NSLog(@"\n\nError:\n%@\n\nServer Response:\n%@\n\nCrash:", error.description, serverResponse);
    [NSException raise:@"Invalid Data" format:@"Unable to process web server response."];
}