Как динамически анализировать JSON в iOS

Мы использовали сторонний сервис и предоставляем JS-файл. Файл js запускает HTTP-запрос и получает json. Мы проанализировали json и получили требуемый контент, но формат json всегда меняется.

Есть ли способ разобрать json, но не обновлять наше приложение?

3 Solutions collect form web for “Как динамически анализировать JSON в iOS”

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

В принципе, я полагаю, что информация в JSON похожа (в противном случае это не имеет смысла вообще), и меняются только ключевые слова. У вас может быть JSON, который вы постоянно обновляете, который переводит ключевые слова, используемые в приложении, в новейший, используемый веб-сервисом.

Таким образом, пример будет выглядеть так. Представьте, что это формат, с которым вы привыкли при разработке приложения (это одно приложение ожидает).

{ "name" : "Henri", "title" : "iOS Developer" } 

Теперь, если вебсервис меняет свою схему и возвращает что-то вроде этого

 { "key1" : "Henri", "key2" : "iOS Developer" } 

У вас должен быть manifest.json, который переводит его так

 { "name" : "key1", "title" : "key2" } 

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

 NSString *name = [actualJSON objectForKey: [manifestJSON objectForKey: @"name"]]; 

На домашней странице JSON есть довольно много материалов по этому вопросу, которые должны позволить вам разработать собственный парсер, если хотите. В нижней части страницы есть также некоторые анализаторы ObjectiveC.

http://www.json.org/

Для этой цели мы рассмотрели стандартную инфраструктуру ключевого маршрута Cocoa, но не были особенно довольны тем, как она сочетается с массивами и словарями. В конце концов я закончил тем, что написал свою собственную небольшую поисковую строку, по существу, как:

 - (id)objectAtPath:(NSString *)path inObject:(id)object { // accept an input string like key1.key2.key3.index.key4.etc; // so we'll split on the dots and use each separate component // to navigate the object graph NSString *components = [path componentsSeparatedByString:@"."]; for(NSString *component in components) { if([object isKindOfClass:[NSDictionary class]]) { // if this is a dictionary, use this component as // a key into the dictionary object = [object objectForKey:component]; } else if([object isKindOfClass:[NSArray class]]) { // if this is an array, use this component // as an index into the array NSInteger index = [component integerValue]; // treat out of bounds indices as finding nil // rather than raising an exception if(index < 0 || index >= [object count]) object = nil; else object = [object objectAtIndex:index]; } } } 

Таким образом, вы можете вызвать objectAtPath:@"shoes.4.typeOfLaces" inObject:jsonResult если «jsonResult» – это словарь, чтобы получить массив «обувь», словарь с индексом 4 в массиве, а затем любое значение, которое имеет словарь для ключа 'typeOfLaces'.

У производственного кода на самом деле есть несколько более умных навигационных средств, позволяющих говорить такие вещи, как «принять, какой бы объект в этом массиве словарей имел наибольшее значение для ключа« размер »или« взять объект с типом = большой, если он существует, иначе взять любой объект ", но именно то, что вы хотите сделать, будет зависеть от вашего приложения и изменчивости схемы.

После навигации по объектным графам по ключевому пути вы можете просто захватить текущие пути ключей с сервера где-нибудь, что позволит вам изменить способ навигации JSON на устройстве без отправки нового двоичного файла.

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

  • Разрешить пользователю отменять MBProgressHUD, когда вызов JSON занимает слишком много времени
  • Как получить пару ключ / значение из NSDictionary?
  • Проводка данных JSON с использованием AFNetworking 2.0
  • Не удалось найти сопоставление объектов для keyPath: ''
  • Код ошибки AFNetworking Код домена = -999? Но отлично работает?
  • Рекурсивно пересекают NSDictionary неизвестной структуры
  • ObjC / iOS: NSCFString не NSString?
  • Любые серверы, обеспечивающие время мусульманской молитвы в JSON / XML?
  • Swift 2 разобрать JSON из онлайн-URL с swiftyJSON
  • Серийная сериализация NSJSONSerialization строки, содержащей косые черты / и HTML, выполняется неправильно
  • Лучшая практика для разбора json в swift 2.0 с alamofire
  • Interesting Posts

    Странные цвета в XCode Interface Builder?

    openURL не работает, когда приложение находится в фоновом режиме в iOS

    Какое максимальное количество разрешений категорииBitMask разрешено в Sprite Kit?

    UIWebViewDelegate: webViewDidFinishLoad не вызывается во время навигации по страницам

    UIWebView для просмотра самозаверяемых веб-сайтов (нет частного api, а не NSURLConnection) – возможно ли это?

    Как назначить определенные BundleDisplayNames для разных целей

    Как сохранить данные, когда приложение iphone переходит в состояние фона или переднего плана?

    Core Data uniquing не работает?

    Прикосновение с добавлением

    Как обрабатывать ошибку синхронизации: «Получен неверный набор изменений: утверждение не выполнено: left (). Link_target_table_ndx == right (). Link_target_table_ndx"

    Как работать с фоновым воспроизведением звука, когда устройство iOS заблокировано или в другом приложении?

    statusBarFrame = 0 после укладки currentViewController

    WKWebView загружает ресурсы из локальной папки документа

    несколько ViewControllers (контейнерViewView? childView? экземпляр viewController?)

    Невозможно добавить платформу для ios и android (ошибка: ENOENT, нет такого файла или каталога)

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