Cocoa-Touch – как разобрать локальный файл Json

Я новичок в iOS dev, и я пытаюсь разобрать локальный Json-файл, такой как

{"quizz":[{"id":"1","Q1":"When Mickey was born","R1":"1920","R2":"1965","R3":"1923","R4","1234","response","1920"},{"id":"1","Q1":"When start the cold war","R1":"1920","R2":"1965","R3":"1923","rep4","1234","reponse","1920"}]}

вот мой код:

  NSString *filePath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"]; NSString *myJSON = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL]; // Parse the string into JSON NSDictionary *json = [myJSON JSONValue]; // Get all object NSArray *items = [json valueForKeyPath:@"quizz"]; NSEnumerator *enumerator = [items objectEnumerator]; NSDictionary* item; while (item = (NSDictionary*)[enumerator nextObject]) { NSLog(@"clientId = %@", [item objectForKey:@"id"]); NSLog(@"clientName = %@",[item objectForKey:@"Q1"]); NSLog(@"job = %@", [item objectForKey:@"Q2"]); } 

Я нашел на этом сайте образец, но получаю следующую ошибку

-JSONValue не удалось. Ошибка: токен «разделитель значений» не ожидается после ключа объекта.

JSON имеет строгую нотацию ключа / значения, ваши пары ключ / значение для R4 и ответ неверны. Попробуй это:

 NSString *jsonString = @"{\"quizz\":[{\"id\":\"1\",\"Q1\":\"When Mickey was born\",\"R1\":\"1920\",\"R2\":\"1965\",\"R3\":\"1923\",\"R4\":\"1234\",\"response\":\"1920\"}]}"; 

Если вы читаете строку из файла, вам не нужны все косые черты
Ваш файл будет примерно таким:

{«quizz»: [{«id»: «1», «Q1»: «Когда родился Микки», «R1»: «1920», «R2»: «1965», «R3»: «1923», «R4»: «1234», «response»: «1920»}, {«id»: «1», «Q1»: «При запуске« холодной войны »,« R1 »:« 1920 »,« R2 »: "1965", "R 3": "1923", "R 4": "1234", "réponse": "1920"}]}


Я тестировал этот код:

 NSString *jsonString = @"{\"quizz\":[{\"id\":\"1\",\"Q1\":\"When Mickey was born\",\"R1\":\"1920\",\"R2\":\"1965\",\"R3\":\"1923\",\"R4\":\"1234\",\"response\":\"1920\"}, {\"id\":\"1\",\"Q1\":\"When start the cold war\",\"R1\":\"1920\",\"R2\":\"1965\",\"R3\":\"1923\",\"R4\":\"1234\",\"reponse\":\"1920\"}]}"; NSLog(@"%@", jsonString); NSError *error = nil; NSDictionary *json = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error]; NSArray *items = [json valueForKeyPath:@"quizz"]; NSEnumerator *enumerator = [items objectEnumerator]; NSDictionary* item; while (item = (NSDictionary*)[enumerator nextObject]) { NSLog(@"clientId = %@", [item objectForKey:@"id"]); NSLog(@"clientName = %@",[item objectForKey:@"Q1"]); NSLog(@"job = %@", [item objectForKey:@"Q2"]); } 

У меня сложилось впечатление, что вы скопировали старый код, поскольку вы не используете сериализацию Apple и Enumerator вместо Fast Enumeration . Весь материал перечисления можно было бы написать просто так:

 NSArray *items = [json valueForKeyPath:@"quizz"]; for (NSDictionary *item in items) { NSLog(@"clientId = %@", [item objectForKey:@"id"]); NSLog(@"clientName = %@",[item objectForKey:@"Q1"]); NSLog(@"job = %@", [item objectForKey:@"Q2"]); } 

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

 NSArray *items = [json valueForKeyPath:@"quizz"]; [items enumerateObjectsUsingBlock:^(NSDictionary *item , NSUInteger idx, BOOL *stop) { NSLog(@"clientId = %@", [item objectForKey:@"id"]); NSLog(@"clientName = %@",[item objectForKey:@"Q1"]); NSLog(@"job = %@", [item objectForKey:@"Q2"]); }]; 
 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"fileName" ofType:@"json"]; NSString *myJSON = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL]; NSError *error = nil; NSArray *jsonDataArray = [NSJSONSerialization JSONObjectWithData:[myJSON dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error]; 

Используйте jsonlint.com для поиска ошибок в строке JSON.
В этом случае говорится, что у вас есть недействительный JSON рядом с "R4"

Кажется, в вашем json-файле есть опечатка.

замещать
"R4","1234","response","1920" с "R4":"1234","response":"1920"
а также
"rep4","1234","reponse","1920" с "rep4":"1234","response":"1920"

Swift 2.3 Я использую утилиту для преобразования файлов JSON в словарь:

 func getDictionaryFromJSON(jsonFileName: String) -> [String: AnyObject]? { guard let filepath = NSBundle.mainBundle().pathForResource(jsonFileName, ofType: "json") else { return nil } guard let data = NSData(contentsOfFile: filepath) else { return nil } do { let dict = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String: AnyObject] return dict } catch { print(error) return nil } } 
  • Как использовать запрос соединения в iOS с использованием синтаксического анализа?
  • Метод мутирования, отправленный на неизменяемый объект
  • Как использовать циклические ссылки в RestKit с использованием $ ref и $ id
  • Как пройти через JSON с SwiftyJSON?
  • ios - получить значения из NSDictionary
  • Идеальный способ вытащить данные (JSON) из службы с помощью Monotouch и iOS?
  • Парсинг json, возвращенный foursquare для iPhone, дает непризнанный ведущий персонаж
  • Быстрое кодирование / декодирование изображений для JSON
  • UITableView не отображается после перезагрузки данных
  • Что вы предпочитаете как клиент RESTful - RestKit vs Resty
  • Основная аутентификация и NSURLConnection через 3G
  • Interesting Posts

    Физические тела SpriteKit не сталкиваются при соединении с суставами

    Как делиться данными между iPhone и Apple Watch с помощью групп?

    Swift: пользовательская камера сохраняет измененные метаданные с изображением

    пользовательский UIButton, непризнанный селектор, отправленный в экземпляр

    Автоматическая компоновка iOS неправильно отображает взгляды по очереди

    Как получить положение символа в NSString?

    Для параметра «appIdName» предоставляется «недопустимое значение»?

    Ошибка CoreAudio – AVAudioIONodeImpl.mm:365: _GetHWFormat: обязательное условие ложно: hwFormat

    CoreBluetooth Central -> Периферийные устройства

    Пользовательская политика в моей модели xcmapping не будет выполнена

    Создайте копию объекта NSManagedObject

    Зачем выпускаете свойство, которое вы уже установили равным нулю?

    Как удалить кеш WKWebview в iOS8?

    Открыть файл в другом приложении

    Как получить данные VCF с контактными изображениями с помощью данных CNContactVCardSerializationWithContacts: method?

    Давайте будем гением компьютера.