Object Mapping пустой ответ с помощью RestKit - PullRequest
2 голосов
/ 22 марта 2012

Благодаря справке здесь и списку рассылки RestKit мне удалось проанализировать мой JSON, но теперь у меня возникла новая проблема - анализ пустого ответа.Чтобы подготовить почву, вот как выглядит JSON, когда мой запрос дает результаты:

    {"blobsList":
        {"blobs":
            [   
                {"createdOn":"2012-03-16T15:13:12.551Z","description":"Fake description ","hint":"And a useless hint","id":400,"name":"Fake CA one","publicId":"FF6","type":0},

                {"createdOn":"2012-03-16T17:33:48.514Z","description":"No hint on this one, but it does have a description.","hint":"Hint","id":402,"name":"Second fake one in CA","publicId":"FF8","type":0}
            ]}}

Итак, я добавил это в свое отображение:

        RKObjectMapping* blobsListMapping = [RKObjectMapping mappingForClass:[GetResponseInRegionResponseList class]];
        [blobsListMapping mapKeyPath:@"blobsList" toAttribute:@"blobsList"];

        [[RKObjectManager sharedManager].mappingProvider setMapping:blobMapping forKeyPath:@"blobsList.blobs"];

        [[RKObjectManager sharedManager].mappingProvider setMapping:blobsListMapping forKeyPath:@"blobsList"];

И вот мои классы:

        @interface GetResponseInRegionResponse : NSObject
        {
            NSString* name;
            NSString* blobId;
            NSString* description;
            NSString* hint;
        }


        @interface GetResponseInRegionResponseList : NSObject
        {
            NSArray  *blobsList;
        }

Но теперь проблема в том, что мой сервер может также вернуть это для JSON:

        {"blobsList":""} 

Да, если запрос не дал результатов, я получаю это обратно.Это вылетает из моего приложения

        restkit.object_mapping:RKObjectMapper.m:255 Performing object mapping sourceObject: {
            blobsList = "";
        }
         and targetObject: (null)

        2012-03-22 11:56:16.233 Ferret[7399:17a07] T restkit.object_mapping:RKObjectMapper.m:269 Examining keyPath 'blobs' for mappable content...
        2012-03-22 11:56:16.233 Ferret[7399:17a07] D restkit.object_mapping:RKObjectMapper.m:279 Found unmappable value at keyPath: blobs
        2012-03-22 11:56:16.233 Ferret[7399:17a07] T restkit.object_mapping:RKObjectMapper.m:269 Examining keyPath 'blobsList.blobs' for mappable content...
        2012-03-22 11:56:16.239 Ferret[7399:17a07] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFConstantString 0xdb1d0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key blobs.'

Так что я пытаюсь найти способ заставить ResKit отобразить этот пустой ответ.Я пробовал все это:

[[RKObjectManager sharedManager].mappingProvider setMapping:blobListMapping forKeyPath:@"blobsList"];
[[RKObjectManager sharedManager].mappingProvider setMapping:NULL forKeyPath:@"blobsList"];
[blobListMapping mapKeyPath:@"" toAttribute:@"blobsList"];
[blobListMapping mapKeyPath:@"blobsList" toAttribute:@"blobsList"];

Но все они терпят крах.Я пытаюсь сделать из головы и хвоста исходники, «этот класс не совместим с кодировкой значений ключей для больших двоичных объектов» озадачивает, так как там нет никаких больших двоичных объектов, просто blobsList.Я ценю любую помощь, спасибо!

1 Ответ

3 голосов
/ 27 марта 2012

Я столкнулся с чем-то похожим в моем проекте. Я отправлял сообщения в веб-службу, и эта служба возвращала мне мой опубликованный объект, завернутый в массив. Это приводило к аварийному завершению работы RestKit при анализе, поскольку ожидалось получить только один объект, а не коллекцию. Чтобы решить эту проблему, я реализовал метод objectLoader: willMapData: Delegate, вытащил объект ответа из массива и отправил этот объект через синтаксический анализ RestKit, и все в порядке.

Может быть, вы можете сделать что-то подобное. Проверьте, возвращаете ли вы строку в списке больших двоичных объектов и конвертируете ее в пустой массив перед отправкой через синтаксический анализ RestKit.

- (void)objectLoader:(RKObjectLoader *)objectLoader willMapData:(id *)mappableData
{
    // Horrible hack to convert posted object that gets returned as an array into a single object
    // that can be mapped.
    //
    if ([objectLoader.targetObject isKindOfClass:[TSLPostPostContract class]])
    {
        if ([*mappableData isKindOfClass:[NSArray class]])
        {
            *mappableData = [*mappableData objectAtIndex:0];
        }
    }
}
...