Objective-C DRY JSON Mapping и создание объектов - PullRequest
6 голосов
/ 11 февраля 2011

Я пытаюсь динамически отобразить информацию JSON в разные объекты. Но я не могу понять, как полностью контролировать ситуацию с указателем, потому что то, что я надеялся, сработало бы.

До сих пор моя методология заключалась в том, чтобы создать словарь для каждого объекта, сопоставляя указатели переменных с эквивалентными ключами JSON. В моем преобразователе JSON у меня есть метод parseJSONFromDictionary:withObject, который должен перебирать словарь, возвращаемый JSONValue SBJSON , и назначать соответствующие значения соответствующим переменным в данном объекте.

-(NSObject *)parseJSONFromDictionary:(NSDictionary *)dict withObject:(NSObject *)start{
    for (NSString *key in dict) {
        if ([[self.mappings objectForKey:key] isMemberOfClass:[NSString class]]) {
            start.[self.mappings objectForKey:key] = [[dict valueForKey:key] stringValue];
        }
    }
    return start;
}

mappings - это словарь, содержащий переменные и ключи json, а dict - это то, что возвращается из анализатора json.

Большая проблема в том, что я не могу сделать start.[self.mappings objectForKey:key]. Я не знаю много о C, и, очевидно, я не знаю достаточно об указателях, так как бы я пошел о создании такой системы? Я знаю, что это не правильный способ сделать это, но каков правильный путь? Я знаю, что это можно сделать, как это делает RestKit , но они не поддерживают OAuth, поэтому я, к сожалению, не могу использовать их прекрасные фреймворки.

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

Спасибо за любую помощь!


РЕДАКТИРОВАТЬ: Кажется, есть некоторая путаница относительно того, что я спрашиваю. Мне не нужна помощь в разборе JSON. Я уже использую SBJSON . Мне не нужна помощь при отправке запросов, я уже использую ODuthConsumer Framework JDG . Я могу только использовать фреймворки, поддерживающие OAuth 2.0.

Мне нужна помощь выяснить, как предотвратить это:

-(Class1 *)parseJsonForClass1:(NSString *)inputString {
    NSDictionary *outputDict = [inputString JSONValue];
    Class1 *instance1 = [self mapObjectsForClass1From:outputDict];
    return instance1;
}

-(Class2 *)parseJsonForClass2:(NSString *)inputString {
    NSDictionary *outputDict = [inputString JSONValue];
    Class2 *instance2 = [self mapObjectsForClass2From:outputDict];
    return instance2;
}

-(Class3 *)parseJsonForClass3:(NSString *)inputString {
    NSDictionary *outputDict = [inputString JSONValue];
    Class2 *instance3 = [self mapObjectsForClass3From:outputDict];
    return instance3;
}

-(Class1 *)mapObjectsForClass1From:(NSDictionary *)dict {
    Class1 *object1 = [[Class1 alloc] init];
    object1.name = [[dict valueForKey:@"name"] stringValue];
    object1.date = [[dict valueForKey:@"date"] stringValue];
    object1.objId = [[dict valueForKey:@"id"] intValue];

    return object1;
}

-(Class2 *)mapObjectsForClass2From:(NSDictionary *)dict {
    Class2 *object2 = [[Class2 alloc] init];
    object2.something = [[dict valueForKey:@"something"] stringValue];
    object2.title = [[dict valueForKey:@"title"] stringValue];
    object2.imageUrl = [[dict valueForKey:@"image_url"] stringValue];

    return object2;
}

-(Class3 *)mapObjectsForClass3From:(NSDictionary *)dict {
    Class3 *object3 = [[Class3 alloc] init];
    object3.foo = [[dict valueForKey:@"bar"] stringValue];
    object3.flag = [[dict valueForKey:@"is_member"] boolValue];
    object3.obj1 = [[Class1 alloc] init];
    object3.obj1 = [self mapOjectsForClass1From:[dict objectForKey:@"name1"]];

    return object3;
}

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

Ответы [ 4 ]

6 голосов
/ 16 ноября 2011

Я знаю, что это старый поток, но подумал поместить его здесь, код здесь в https://github.com/mystcolor/JTObjectMapping сможет помочь в отображении объектов.Вы захотите подготовить сопоставления и свой пользовательский объект, прежде чем использовать это.Я нашел это при поиске в Google .... не использовал это все же.Нужно попробовать.

5 голосов
/ 11 февраля 2011

Вы можете использовать KVC. Создайте установщик для каждого значения в словаре JSON, который вы хотите вставить в свой объект, и используйте -setValue:forKey: для фактической установки значений, например,

-(NSObject *)parseJSONFromDictionary:(NSDictionary *)dict withObject:(NSObject *)start
{
    for (NSString *key in [dict allKeys]) 
    {
        NSString* propertyName = [[self mappings] objectForKey: key];
        [start setValue: [dict objectForKey: key] forKey: propertyName];
        // the above line will throw an exception if start does not have a set accessor for property
    }
    return start;
}
2 голосов
/ 08 июля 2011

Я недавно видел, как кто-то делает это, используя Объективные ресурсы .Несмотря на то, что это хороший способ получить доступ к объектам, некоторые из реализаций могут запутатьсяИ вы должны использовать все, что посылает вам сервер, нравится вам это или нет.Я сейчас держусь от этого подальше.

0 голосов
/ 11 февраля 2011

Также посмотрите на HTTPRiot , который берет на себя большую часть коммуникационных усилий, обрабатывает соединения асинхронно и т.д.минимальный) показывает как его использовать;часть кода устарела, но в целом передает сообщение.

...