我正在使用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?
下面是我用来管理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"];
}
答案 0 :(得分:4)
@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
答案 1 :(得分:3)
在解析完成后调用的RKObkectLoaderDelegate中有一个willMapData:选择器。 mappableData argumet是可变的,所以我猜你可以在对象映射发生之前更改数据。
答案 2 :(得分:3)
使用RKObjectRequestOperation.setWillMapDeserializedResponseBlock:
。
在swift:
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 :(得分:1)
对我来说,唯一的解决方案是在服务器级别修改返回的对象。 如果你不能,只需返回服务器。
答案 4 :(得分:1)
您可以注册自己的解析器。我必须这样做才能从遗留系统中修改和清理一些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
答案 5 :(得分:0)
编辑JSOn的响应非常困难。更好的方法是只在服务器端进行更改,如@beber所述