Джексон эквивалент для iPhone? - PullRequest
6 голосов
/ 21 ноября 2011

Я широко использовал Джексона на стороне сервера для преобразования из POJO в JSON, и мне было интересно, есть ли подобная библиотека для Objective C / iPhone SDK и наоборот.Цель C обеспечивает отражение, поэтому должно быть возможно сделать что-то похожее на Джексона.

Ответы [ 3 ]

4 голосов
/ 19 февраля 2014

Вы можете попробовать GoldenFleece , который преобразует объекты JSON и Objective-C, используя шаблон соглашения о конфигурации, вдохновленный Джексоном .

2 голосов
/ 21 ноября 2011

новые iOS 5 API предоставляют отличные возможности для чтения / записи JSON.Это, по сути, переосмысление библиотеки TouchJSON , которую вы можете использовать в iOS 4. Хотя я еще не видел много примеров, которые будут генерировать объекты POCO из примера полезной нагрузки, вы можете создавать классы, которые являются простофасад для экземпляра NSDictionary, который будут возвращены вышеупомянутыми библиотеками.

Например:

@interface PBPhoto : NSObject {
    NSDictionary* data_;
}

@property (nonatomic, retain, readonly) NSDictionary *data;

- (NSString*) photoId;
- (NSString*) userId;
- (NSString*) user;
- (NSString*) title;
- (id) initWithData:(NSDictionary*)data;


@end

Реализация:

#import "PBPhoto.h"

#define PHOTO_ID @"id"
#define USER_ID @"user_id"
#define USER @"user"
#define TITLE @"title"

@implementation PBPhoto
@synthesize data = data_;

- (id) initWithData:(NSDictionary*)data {
    if ((self = [super init])) {
        self.data = data;
    }

    return self;
}

- (NSString*) photoId {
    return [super.data objectForKey:PHOTO_ID];
}

- (NSString*) userId {
    return [self.data objectForKey:USER_ID];
}

- (NSString*) user {
    return [self.data objectForKey:USER];
}

- (NSString*) title {
    return [self.data objectForKey:TITLE];
}

- (void) dealloc {
    [data_ release];
    [super dealloc];
}

@end
1 голос
/ 21 ноября 2011

То, что Objective-C обеспечивает отражение, может быть преуменьшением года, но многие вещи раскрываются только средой выполнения низкого уровня C и, следовательно, немного глупы.

Предполагая, что вы хотите взять произвольный объект и превратить его в JSON, возможно, разумнее всего создать NSDictionary в качестве посредника, а затем передать его в NSJSONSerialization (или создать строку самостоятельно, поскольку сторонние библиотеки достаточно тяжелые из-за бремени возможности десериализации).

Так, например:

- (NSDictionary *)dictionaryOfPropertiesForObject:(id)object
{
    // somewhere to store the results
    NSMutableDictionary *result = [NSMutableDictionary dictionary];

    // we'll grab properties for this class and every superclass
    // other than NSObject 
    Class classOfObject = [object class];
    while(![classOfObject isEqual:[NSObject class]])
    {
        // ask the runtime to give us a C array of the properties defined
        // for this class (which doesn't include those for the superclass)
        unsigned int numberOfProperties;
        objc_property_t  *properties = 
                     class_copyPropertyList(classOfObject, &numberOfProperties);

        // go through each property in turn...
        for(
              int propertyNumber = 0;
              propertyNumber < numberOfProperties;
              propertyNumber++)
        {
            // get the name and convert it to an NSString
            NSString *nameOfProperty = [NSString stringWithUTF8String:
                                  property_getName(properties[propertyNumber])];

            // use key-value coding to get the property value
            id propertyValue = [object valueForKey:nameOfProperty];

            // add the value to the dictionary —
            // we'll want to transmit NULLs, even though an NSDictionary
            // can't store nils
            [result
                  setObject:propertyValue ? propertyValue : [NSNull null]
                  forKey:nameOfProperty];
        }

        // we took a copy of the property list, so...
        free(properties);

        // we'll want to consider the superclass too
        classOfObject = [classOfObject superclass];
    }

    // return the dictionary
    return result;
}

Затем вы можете использовать + dataWithJSONObject:options:error: на NSJSONSerialization с возвращенным словарем.

Чтобы пойти другим путем, я думаю, вы бы использовали метод кодирования значения ключа setValue:forKey:, получая ключи и значения из словаря через allKeys и valueForKey:.

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