【问题标题】:Mapping a JSON response to an object using RestKit and Objective-C使用 RestKit 和 Objective-C 将 JSON 响应映射到对象
【发布时间】:2012-01-08 17:17:57
【问题描述】:

我对 Objective-C 比较陌生,我正在尝试使用 RestKit 从 Web 服务接收 JSON 响应。我已成功将数据接收回我的应用程序,查看响应如下所示:

{id:"1","Translation":"Test"}

我想将此翻译映射到我的应用程序中的“翻译”对象,但尝试了几种不同的方法,但不确定如何实现。

所以我的问题是:

  1. 如何将此响应映射到我的翻译对象
  2. 我这样做是否正确,创建了一个方法来完成这个调用,胜过我的视图控制器?

我的翻译对象

@implementation Translation  

@synthesize identifier = _identifier;
@synthesize translation = _translation;

- (NSDictionary*)elementToPropertyMappings {  
return [NSDictionary dictionaryWithKeysAndObjects:  
        @"id", @"identifier",  
        @"translation", @"translation",
        nil];  
}  

@end

我的翻译方法

- (NSString *)performTranslation:(NSString *)translation
{

NSString *data = [[NSString alloc] initWithFormat:@"{\"SourceId\": \"%@\",\"RegionTag\": \"%@\",\"InputString\": \"%@\"}", @"1", @"Glasgow", translation];
NSString *post = data;

RKRequest *MyRequest = [[RKRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"http://my.url.com/Translation/Translate"]];
MyRequest.method = RKRequestMethodPOST;
MyRequest.HTTPBodyString = post;
MyRequest.additionalHTTPHeaders = [[NSDictionary alloc] initWithObjectsAndKeys:@"application/json", @"Content-Type", @"application/json", @"Accept", nil];
[MyRequest send];

RKResponse *Response = [MyRequest sendSynchronously];

return Response.bodyAsString; <--- looking to map this to translation object here

}

【问题讨论】:

    标签: objective-c xcode4 xcode4.2 restkit


    【解决方案1】:

    您的代码的 sn-p 似乎有点过时了。我强烈建议阅读最新的Object Mapping guide,以便充分利用 RestKit 的潜力——尤其是 Mapping without KVC 部分。

    编辑:

    为了使用 RestKit 发布对象并收到回复,我们定义了一个 TranslationRequest 类来保存我们的请求和 Translation 来保存我们的响应。

    首先,我们设置 RKObjectManager 和映射(我通常在我的 AppDelegate 中这样做):

    RKObjectManager *manager = [RKObjectManager objectManagerWithBaseURL:kOurBaseUrl];
    [manager setSerializationMIMEType:RKMIMETypeJSON];
    //this is a singleton, but we keep the manager variable to avoid using [RKObjectManager sharedManager] all the time
    
    //Here we define a mapping for the request. Note: We define it as a mapping from JSON to entity and use inverseMapping selector later.
    RKObjectMapping *translationRequestMapping = [RKObjectMapping mappingForClass:[TranslationRequest class]];
    [translationRequestMapping mapKeyPath:@"RegionTag" toAttribute:@"regionTag"];
    ...
    [[manager mappingProvider] setSerializationMapping:[translationRequestMapping inverseMapping] forClass:[TranslationRequest class]];
    
    //now we define the mapping for our response object
    RKObjectMapping *translationMapping = [RKObjectMapping mappingForClass:[Translation class]];
    [translationMapping mapKeyPath:@"id" toAttribute:@"identifier"];
    [translationMapping mapKeyPath:@"Translation" toAttribute:@"translation"];
    [[manager mappingProvider] addObjectMapping:mapping];
    
    //finally, we route our TranslationRequest class to a given endpoint
    [[manager router] routeClass:[TranslationRequest class] toResourcePath:kMyPostEndpoint];
    

    这应该足够了必要的设置。我们可以在代码中的任何位置(例如在任何控制器中)调用我们的后端,如下所示:

    //we create new TranslationRequest
    TranslationRequest *request = [[TranslationRequest alloc] init];
    [request setRegionTag:@"Hello"];
    ....
    //then we fetch the desired mapping to map our response with
    RKObjectMapping *responseMapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:class]
    //and just call it. Be sure to let 'self' implement the required RKObjectManagerDelegate protocol
    [[RKObjectManager sharedManager] postObject:request mapResponseWith:responseMapping delegate:self];]
    

    尝试这种方法,如果您需要任何帮助,请告诉我。我无法完全测试它,因为我没有任何合适的后端可以返回响应,但从 RestKit 日志来看,这应该可以工作。

    【讨论】:

    • 非常感谢您的回复。你能帮我举个例子吗?我对 Objective-C 比较陌生,虽然我已经阅读了这篇文章,但我还没有找到可以让我将 JSON 发布到服务器的东西,这是检索我的响应所必需的。
    • 当然。您需要向服务器发布什么?也许这个答案会对您有所帮助(描述如何发布数组)stackoverflow.com/questions/7726437/… - 如果没有,请随时与我联系。
    • 谢谢。我想我理解你的例子。我的问题是 1)如何格式化我的数据以进行发布 - 格式必须如上,因为服务无法更改。 2)如何发布到服务(似乎有很多不同的方式)并接收响应 3)如何将响应映射到自定义对象。我认为我一直关注的文档有些过时,这让我有些困惑。如果您能够提供一个带有上下文的示例,我将不胜感激。
    • 只是为了确定。您发送的对象(您问题中的 JSON 表示形式)与您希望从服务器接收回的对象相同?
    • 对不起,忽略我的评论。我看到你想发布一个不同的对象 - 你构造为字符串的那个。
    【解决方案2】:

    您需要将返回的 JSON 字符串传递给 JSON 解析器。我使用SBJSON。然后,您可以使用生成的字典来填充对象的属性。

    RestKit 似乎有封装了四种不同 JSON 解析器的原生对象。但是,我建议谨慎,因为他们似乎假设顶级解析对象将始终是字典。

    另外,您问题中的示例不是有效的 JSON。它应该是这样的:

    {"id":"1","Translation":"Test"}
    

    【讨论】:

      猜你喜欢
      • 2011-11-25
      • 2012-01-09
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2023-03-12
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多