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 не удалось. Ошибка: токен «разделитель значений» не ожидается после ключа объекта.

5 Solutions collect form web for “Cocoa-Touch – как разобрать локальный файл Json”

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 } } 
  • Alamofire 4 URL-запрос для кодирования параметра JSON
  • SWIFT 3 - вытащите html-теги из строки, взятой из веб-сайта JSON
  • Сериализовать настраиваемый объект для JSON, который содержит NSMutableArray
  • iOS - Хостинг JSON-файла для его анализа с использованием URL-адреса
  • Swift 2.0 Alamofire Completion Handler Return Json
  • Visual Studio Cordova, построивший пакет iOS через проблемы удаленного агента
  • RestKit - приложение ожидаемого типа контента / json
  • Как искать файлы JSON?
  • Проводка JSON в Objective-C
  • Работа с AES-шифрованием в IOS
  • iPhone RestKit, как загрузить локальный файл JSON и сопоставить его с основным объектом данных?
  • Interesting Posts

    возвращать поплавки в объектив-c из функции сборки рукоятки

    Добавьте UIView поверх UITableViewController в Swift

    requestWhenInUseAuthorization в iOS 8 и ждать ответа пользователя

    не удалось проверить, существует ли профиль конфигурации на iPhone

    iOS: UIPageViewController – используйте кнопку для перехода на следующую страницу

    в покупке приложения, подтверждение получения продукции теперь проверяет покупки в песочнице?

    Objective C – узкие типы переменных экземпляра в подклассах?

    Поделитесь комментариями в сообществах Google+

    Пример кода Apple для расширенного фона WatchKit

    Offline html5 в UIWebView

    Как узнать, изменилась ли SIM-карта пользователя iPhone?

    Как предотвратить вспышку при вызове drawViewHierarchyInRect: afterScreenUpdates: на iOS 8?

    настройка стиля редактирования ячейки в uitableview в ios

    iOS – Изменить шрифт текста для каждого сегмента в UISegmentController

    Ткань Beta против Apple TestFlight для распространения бета-приложений iOS?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.