Как разобрать JSON в приложении для iOS - PullRequest
6 голосов
/ 23 сентября 2011

Я получаю ответ из твиттера в виде строки,

Что мне нужно, это отправить части, где находится комментарий к массиву,

вот пример строки

[{"geo":null,"coordinates":null,"retweeted":false,... 
"text":"@KristinaKlp saluditos y besos d colores!"},{"geo":null,"coordinates...

так что мне действительно нужны посты после "text": "=

@ KristinaKlp saluditos y besos d colores!

Итак, как я могу взять строку и разобрать ее, чтобы, я надеюсь, получить все сообщения в массиве?

Большое спасибо!

Ответы [ 6 ]

10 голосов
/ 23 сентября 2011

Я не выполнял анализ JSON в приложении для iOS, но вы должны иметь возможность использовать библиотеку, такую ​​как json-framework .Эта библиотека позволит вам легко анализировать JSON и генерировать JSON из словарей / массивов (это действительно все, из чего состоит JSON).

Документы SBJson:

JSON сопоставлен с Objective-C вводится следующим образом:

  • null -> NSNull
  • string -> NSString
  • array -> NSMutableArray
  • object -> NSMutableDictionary
  • true -> NSNumber's -numberWithBool: ДА
  • false -> NSNumber's -numberWithBool: NO
  • целое число до 19 цифр -> NSNumber's -numberWithLongLong:
  • все остальные числа -> NSDecimalNumber

Поскольку Objective-C не имеет выделенного класса для логических значений, они превращаются в экземпляры NSNumber.Однако, поскольку они инициализируются с помощью метода -initWithBool: они возвращаются обратно в JSON.Другими словами, они не будут внезапно становиться 0 или 1;они будут снова представлены как 'true' и 'false'.

Поскольку оптимизация целых чисел длиной до 19 цифр (максимальная длина для длинных целых чисел со знаком) превращается в экземпляры NSNumber, а сложные - вв экземпляры NSDecimalNumber.Таким образом, мы можем избежать потери точности, так как JSON допускает смехотворно большие числа.

@ page objc2json Objective C-JSON

Типы Objective C сопоставляются с типами JSON следующим образом:

  • NSNull -> null
  • NSString -> строка
  • NSArray -> массив
  • NSDictionary -> объект
  • NSNumber's -initWithBool: YES -> true
  • NSNumber's -initWithBool: NO -> false
  • NSNumber -> число

@ note В JSON ключи объекта должны бытьстроки.Ключи NSDictionary не должны быть, но попытка преобразовать NSDictionary с нестроковыми ключами в JSON вызовет исключение.

Экземпляры NSNumber, созданные с помощью -numberWithBool: метода, преобразуются в логические JSON "true" и "ложные значения и наоборот.Любые другие экземпляры NSNumber преобразуются в число JSON, как вы ожидаете.

Учебники

Есть ли учебники?Да!Все эти учебные пособия предоставлены сторонними специалистами:

JSON Framework для iPhone - учебник по Flickr, состоящий из трех частей Джона Мухоу. JSON через HTTP на iPhone - Дэн Григсби. От AS3 к Какао touch : JSON от Andy Jacobs.

Существуют и другие библиотеки, которые вы можете проверить, такие как TouchJSON, JSONKit, Another Another JSON Library

4 голосов
/ 11 марта 2014

NSJSONSerialization очень хорошо выполняет преобразование ваших данных JSON в пригодные для использования структуры данных как NSDictionary или NSArray. Я рекомендую его, даже больше, потому что он является частью общедоступного интерфейса Cocoa и поддерживается Apple.

Однако, если вы хотите отобразить содержимое вашего JSON на ваши объекты Objective-C, вам придется сопоставить каждый атрибут из NSDictionary / NSArray со свойством объекта. Это может быть немного болезненно, если у ваших объектов много атрибутов.

Чтобы автоматизировать процесс, я рекомендую вам использовать категорию Motis (персональный проект) для NSObject, чтобы сделать его очень легким и гибким. Вы можете прочитать, как использовать это в этом посте . Но просто чтобы показать вам, вам просто нужно определить словарь с сопоставлением атрибутов вашего объекта JSON с именами свойств вашего объекта Objective-C в ваших подклассах NSObject:

- (NSDictionary*)mjz_motisMapping
{
    return @{@"json_attribute_key_1" : @"class_property_name_1",
             @"json_attribute_key_2" : @"class_property_name_2",
              ...
             @"json_attribute_key_N" : @"class_property_name_N",
            };
}

, а затем выполните анализ, выполнив:

- (void)parseTest
{
    NSData *data = jsonData; // <-- YOUR JSON data 

    // Converting JSON data into NSArray (your data sample is an array)
    NSError *error = nil;
    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

    if (error)
        return; // <--- If error abort.

    // Iterating over raw objects and creating model instances
    NSMutableArray *parsedObjects = [NSMutableArray array];

    for (NSDictionary *rawObject in jsonArray)
    {
        // Creating an instance of your class
        MyClass instance = [[MyClass alloc] init];

        // Parsing and setting the values of the JSON object
        [instance mjz_setValuesForKeysWithDictionary:rawObject];

        [parsedObjects addObject:instance];
    }

    // "parseObjects" is an array with your parsed JSON.
    // Do whatever you want with it here.
}

Настройка свойств из словаря выполняется с помощью KeyValueCoding (KVC), и вы можете проверить каждый атрибут перед установкой его с помощью проверки KVC.

1 голос
/ 30 мая 2013
-(IBAction)btn_parse_webserivce_click:(id)sender
{
// Take Webservice URL in string.
NSString *Webservice_url = self.txt_webservice_url.text;
NSLog(@"URL %@",Webservice_url);
// Create NSURL from string.
NSURL *Final_Url = [NSURL URLWithString:Webservice_url];
// Get NSData from Final_Url
NSData* data = [NSData dataWithContentsOfURL:
Final_Url];
//parse out the json data
NSError* error;
// Use NSJSONSerialization class method. which converts NSData to Foundation object.

NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:data
options:kNilOptions
error:&error];
// Create Array
NSArray* Response_array = [json objectForKey:@"loans"];
NSLog(@"Array: %@", Response_array);
// Set Response_array  to textview.
self.txt_webservice_response.text = [NSString stringWithFormat:@"%@"
,Response_array];
}
1 голос
/ 23 сентября 2011

Я недавно должен был сделать это. Изучив различные варианты, я бросил JSONKit в свое приложение (я нашел его в обсуждении JSON по StackOverflow). Зачем? А) ОЧЕНЬ ОЧЕНЬ просто. Я имею в виду, все, что у него есть, это основные функции синтаксического анализа / генерации, что еще вам нужно? Б) ОЧЕНЬ ОЧЕНЬ быстро. Никаких накладных расходов - просто сделай свою работу.

Должен заметить, я никогда раньше не делал JSON - только слышал об этом термине и даже не знал, как его записать. Я перешел из ничего в рабочее приложение примерно за 1 час. Вы просто добавляете один класс в свое приложение (.h, .m), создаете его экземпляр и вызываете анализатор для объекта словаря. Вуаля. Если он содержит массив, вы просто получаете objectForKey, приводите его как NSArray. Это действительно трудно сделать проще и быстрее.

1 голос
/ 23 сентября 2011

Чтобы хорошо сравнить скорость работы различных библиотек для анализа JSON на iOS, взгляните на The Ultimate Showdown .

0 голосов
/ 30 мая 2013

Как насчет NSJSONSerialization? Я использовал его для анализа JSON

http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html

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