Как динамически анализировать JSON в iOS - PullRequest
1 голос
/ 18 ноября 2011

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

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

Ответы [ 3 ]

1 голос
/ 18 ноября 2011

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

По сути, я предполагаю, чтоИнформация в 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"]];
0 голосов
/ 18 ноября 2011

Для этой цели мы рассмотрели стандартную инфраструктуру Key Path компании 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'.

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

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

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

0 голосов
/ 18 ноября 2011

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

http://www.json.org/

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