Как изменить JSON перед отображением с помощью RESTKIT - PullRequest
5 голосов
/ 01 января 2012

Я использую RESTKIT для сопоставления JSON, возвращенного с сервера.

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

{"term":"Zh","results":{"users":[{"id":{"$oid":"4ebe59970a614e0019000055"},"term":"some text","score":1}]}

Как преобразовать приведенный выше результат JSON в следующий:

{"results":{"users":[{"uid":"4ebe59970a614e0019000055","text":"some text"}]}

Также, где я могусделать так, чтобы отображение RESTKIT использовало преобразованный JSON вместо исходного?

Ниже приведен класс загрузчика, который я использую для управления JSON и сопоставлениями

-(void)getObjects
{
    RKObjectManager *sharedManager = [RKObjectManager sharedManager];
    [sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self];
}

- (void)request:(RKRequest*)request didLoadResponse:(RKResponse*)response {
    NSLog(@"Loaded PAYLOAD successfully for %@, with response %@", self.resourcePath , [response bodyAsString]  );
}


- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects 
{
}


+ (void)setManagerAndMappings
{
    RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:SERVER_URL];
    RKObjectMappingProvider* provider = [[RKObjectMappingProvider new] autorelease];

    //User Object Mapping
    RKObjectMapping* userMapping = [RKObjectMapping mappingForClass:[User class]];
    [userMapping mapKeyPath:@"_id" toAttribute:@"uid"];

    [userMapping mapAttributes:@"avatar_url",@"created_at",@"email",@"name",@"nickname",@"follower_count",@"following_count",@"answer_count",@"new_notification_count",@"new_questions_count",@"is_following",@"facebook_configured",@"twitter_configured",@"description",@"approved",@"type", nil];
    [provider setMapping:userMapping forKeyPath:@"user"];

}

Ответы [ 6 ]

4 голосов
/ 04 апреля 2014

@ Ответ Shocks является привлекательным, к сожалению, он действителен для версии до 0,20.

В любом случае, аналогичное решение доступно и для 0,20 с использованием реализации RKSerialization:

@interface ORRKJsonSerialization : NSObject <RKSerialization>
@end

и реализации

@implementation ORRKJsonSerialization

+ (id)objectFromData:(NSData *)data error:(NSError **)error
{
    id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:error];
    // change your data before mapping
    return result;
}

+ (NSData *)dataFromObject:(id)object error:(NSError **)error
{
    return [NSJSONSerialization dataWithJSONObject:object options:0 error:error];
}

@end

затем во время настройки:

[RKMIMETypeSerialization registerClass:[ORRKJsonSerialization class] forMIMEType:@"application/json"];

HTH

3 голосов
/ 05 февраля 2015

использовать RKObjectRequestOperation.setWillMapDeserializedResponseBlock:.

В быстром:

    let request = RKObjectManager.sharedManager().requestWith...
    let operation = RKObjectManager.sharedManager().managedObjectRequestOperationWithRequest(request, managedObjectContext: context, success: { operation, result in
        // success
    }, failure: { operation, error in
        // failure
    })
    operation.setWillMapDeserializedResponseBlock { deserializedResponse -> AnyObject! in
        // Here to transform response
        return transformResponse(deserializedResponse)
    }
    RKObjectManager.sharedManager().enqueueObjectRequestOperation(operation)
3 голосов
/ 02 января 2012

В RKObkectLoaderDelegate имеется селектор willMapData:, который вызывается сразу после завершения анализа. Аргумент mappableData является изменяемым, поэтому, я думаю, вы можете изменить данные непосредственно перед отображением объекта.

1 голос
/ 10 января 2013

Вы можете зарегистрировать свой собственный парсер.Я должен был сделать это, чтобы изменить и очистить JSON из устаревшей системы.

[[RKParserRegistry sharedRegistry] setParserClass:[MyJSONParser class]
                                          forMIMEType:@"application/json"];

А затем создать свой собственный:

#import <RestKit/RestKit.h>
#import <RestKit/RKJSONParserJSONKit.h>
#import <RestKit/JSONKit.h>
#import <RestKit/RKLog.h>

@interface EFJSONParser : RKJSONParserJSONKit
- (NSDictionary *)objectFromString:(NSString *)string error:(NSError **)error;
@end
1 голос
/ 02 января 2012

Для меня единственным решением является модификация возвращаемого объекта на уровне сервера.Если вы не можете, просто карта, которая возвращает сервер.

0 голосов
/ 02 января 2012

Редактировать ответ JSOn очень сложно.лучший способ - вносить изменения только на стороне сервера, как говорит @ beber

...