Как динамически анализировать 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 могло толковать как язык сценариев, независимо от того, насколько он ограничен.

  • iPhone iOS как сериализовать / сохранить UIColor в файл JSON?
  • Как я могу проверить Если я получил null от json?
  • Отображение вложенного массива с помощью RestKit / iOS
  • Разбор массива JSON в быстром
  • Создание строки JSON из NSDictionary в iOS
  • Утечка памяти Parser SBJSON
  • Как десериализовать json-объект и назначить NSDictionary в iOS
  • Предварительно заполненная версия Core Data?
  • NSMutableURLRequest с параметром - не может анализировать ответ
  • Поддерживает ли JSONKit ARC или есть вилка, поддерживающая ARC?
  • Как декодировать точки маршрута из выходных данных JSON?
  • Firebase: Swift - значение запроса в дочернем узле без знания родительского ключа
  • Interesting Posts

    Пользователь-агент не изменяется в NSMutableURLRequest

    поверните на 180 градусов для UIImageView и поверните назад по тому же маршруту

    Как угасать углы / края / границы UIImageView

    Отключить двойное нажатие в MKMapView (iOS 6)

    Как установить приложение iOS для использования USB-аудио для ввода и вывода на внутренние колонки

    xcassets: значок приложения XXxXX требуется для приложений iPhone, предназначенных для выпусков iOS до 7.0

    Для проектов iOS в Xcode, почему целевой трафик установлен для сборки по умолчанию при запуске?

    Сообщение NSProgress после вызова паузы

    Можем ли мы запустить передатчик iBeacon в фоновом режиме?

    Не удалось установить Xamarin.Mobile в проекте PCL iOS

    Простой заголовок в наборе настроек ios

    Преобразуйте UIImage в CIImage, чтобы обрезать CGRect. AVFoundation

    вращение инкремента при перемещении и загрузке спрайтов вокруг родительского узла

    Ошибка: undefined не является объектом (оценка \ "RCTWebSocketManager.connect \ ')

    CNContactViewController скрыть навигационную панель после contactImage fullscreenView

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