2013-07-05 3 views
0

У меня есть конечный путь JSON, который принимает почтовые запросы в следующем формате.POST с комплектом отдыха

{'values': [ 
    { 
    "date":<measurement date as Unix time stamp> 
    "value":<weight> 
    } 
    { 
    "date":<measurement date as Unix time stamp> 
    "value":<weight> 
    } 
    ...]} 

«Значение» представлено класс «EntryCollection», а каждое значение представлено класс «вход». Я озадачен тем, что нашел правильный способ сопоставить мои объекты с представлением JSON. Прямо сейчас у меня есть следующий код, который вызывает ошибку: «Операция сопоставления не смогла найти какие-либо вложенные представления объектов при найденных путях ключей».

RKObjectMapping *entryMapping = [RKObjectMapping requestMapping]; 

RKObjectMapping *valuesMapping = [RKObjectMapping mappingForClass:[EntriesCollection class]]; 
[valuesMapping addAttributeMappingsFromDictionary:[EntryCollection attributesMapping]]; 

[singleEntryMapping addAttributeMappingsFromDictionary:[SingleEntry attributesMapping]]; 
[singleEntryMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"entries" toKeyPath:@"entries" withMapping:valuesMapping]]; 
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:entryMapping 
                       objectClass:mappedClass 
                       rootKeyPath:nil]; 

[self.objectManager addRequestDescriptor:requestDescriptor]; 
NSString *path = [self pathForPOST]; 

[self.objectManager postObject:weights path:path parameters:nil success:nil failure:nil]; 

EDIT для структуры данных

Моя структура данных проста (я предполагаю):

EntryCollection 
- NSArray *entries (a collection of objects of type Entry) 

Entry 
- NSDate *date 
- NSNumber *weight; 

Я хотел бы опубликовать EntryCollection наполненную записей. Отображение EntryCollection - это «записи -> значения», один из которых - «дата -> дата, вес -> значение».

+0

Ваша структура класса действительно не ясна, поскольку у вас много разных классов в ваших отображениях, и большинство отображений кажутся частичными. Вам может быть проще создавать сопоставления, как если бы вы разбирали JSON, а затем принимали обратный. В противном случае вам нужно будет отобразить полную структуру классов. – Wain

+0

Я обновил свой вопрос с помощью структуры данных. – ff10

ответ

0

Я нашел решение. Оказывается, мне нужно сопоставление отношений для описания иерархии, подразумеваемой в JSON. Поскольку для каждого объекта значений нет типа, я создал «пустое» сопоставление и добавил к нему сопоставление отношений. Я также забыл установить правильный MIMEType и инвертировать отображение атрибутов моего класса. Думаю, несколько дней в restkit нужны, чтобы понять это.

RKObjectMapping *entryMapping = [RKObjectMapping requestMapping]; 
     [entryMapping addAttributeMappingsFromDictionary:[SingleEntry attributesMapping]]; 
     RKObjectMapping *entrySerializedMapping = [entryMapping inverseMapping]; 

    RKRelationshipMapping *entryRelationship = [RKRelationshipMapping relationshipMappingFromKeyPath:@"entries" toKeyPath:@"values" withMapping:entrySerializedMapping]; 

    RKObjectMapping *valueMapping = [RKObjectMapping requestMapping]; 

    [valueMapping addPropertyMapping:valueMapping]; 

    RKRequestDescriptor *descriptor = [RKRequestDescriptor requestDescriptorWithMapping:valueMapping objectClass:[EntriesCollection class] rootKeyPath:nil]; 

    [self.objectManager addRequestDescriptor:descriptor]; 
    self.objectManager.requestSerializationMIMEType = RKMIMETypeJSON; 

    NSString *path = [self pathForPOST]; 

    [self.objectManager postObject:entryCollection path:path parameters:nil success:nil failure:nil]; 
1

В любом случае, ваш JSON полезного запроса должен подтвердить следующую структуру данных:

NSArray 

    | 
    |______NSDictionary ->Key: Date Value: weight 
    |     ->Key: value Value: weight 
    | 
    |______NSDictionary ->Key: Date Value: weight 
    |     ->Key: value Value: weight 
    | 
    |______NSDictionary ->Key: Date Value: weight 
         ->Key: value Value: weight 

NSArray Оба и NSDictionary полностью совместим с форматом JSON данных. Я не знаю о вашей базовой структуре объектов, но в конечном итоге этот массив должен быть отправлен в качестве полезной нагрузки запроса NSData, и вы будете готовы.

+0

JSON может иметь словарь в качестве корня, и это никак не помогает с проблемой сопоставления ... – Wain

1

Ну, если у вас есть проблема при сопоставлении, вам нужно будет показать свою модель и класс и сопоставление, или поместите RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace); где-нибудь в свой код, и давайте посмотрим вывод.

В качестве альтернативы, если ваша структура объектов отличается от того, что вы хотите отправить на сервер, вы можете использовать встроенный клиент AFNetworking и сделать простой запрос.

[[RKObjectManager sharedManager].HTTPClient postPath:@"" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"WHOOO"); 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     // 
    }]; 
+0

Я обновил свой вопрос с помощью структуры данных. – ff10

Смежные вопросы