【问题标题】:RestKit - Mapping multiple Entites from a (not really good RESTful) JSON responseRestKit - 从(不是很好的 RESTful)JSON 响应映射多个实体
【发布时间】:2013-07-10 02:55:58
【问题描述】:

我的 JSON 响应如下所示:

{
  "enabled": false,
  "number_of_articles": 20,
  "new_users": [
    {
        "id": "5001",
        "name": "Jimmy Valner"
    },
  ],
  "articles" : [
  { 
    "id" : 33122,
    "title" : "Something",
    "authors": [
      {
          "id": "511",
          "name": "Somebody"
      },
      {
          "id": "51",
          "name": "Somebody else"
      }
  }]
}

据我所知,这并不是一个真正正确的 RESTful 响应。但我必须以某种方式将其映射到两个不同的实体(用户和文章)。 A 已经有文章部分的工作代码。它将文章和文章映射为关系。 我是这样做的:

RKMapping *mapping = [MappingProvider articlesMapping];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor
                                            responseDescriptorWithMapping:mapping
                                            pathPattern:@"/articles/:userId/latest"
                                            keyPath:@"articles"
                                            statusCodes:statusCodeSet];
NSURLRequest *request = [[RKObjectManager sharedManager] requestWithObject:nil
                                                  method:RKRequestMethodGET
                                                    path:[NSString stringWithFormat:@"/articles/%@/latest", [[CredentialStore sharedInstance] userId]]
                                              parameters:nil];

RKManagedObjectStore *store = [[DataModel sharedDataModel] objectStore];

RKManagedObjectRequestOperation *operation = [[RKManagedObjectRequestOperation alloc] initWithRequest:request
                                                                    responseDescriptors:@[responseDescriptor]];
operation.managedObjectCache = store.managedObjectCache;
operation.managedObjectContext = store.mainQueueManagedObjectContext;

[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    NSLog(@"%@", mappingResult.array);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    NSLog(@"ERROR: %@", error);
    NSLog(@"Response: %@", operation.HTTPRequestOperation.responseString);
}];
[operation start];

这是按预期工作的。我在+ (RKMapping *)articlesMapping 方法中提供了映射说明。甚至 JSON 响应的作者部分也被正确映射。

现在我想将new_users 数组映射到不同的实体(显然是用户)。如何通过不向服务器调用另一个请求来做到这一点?我在创建另一个RKManagedObjectRequestOperation *operation 方面取得了一些成功,但这当然会触发另一个我想避免的对服务器的网络请求。 我应该在RKObjectManager 中寻找解决方案,还是应该以某种方式更改 keyPath 以从根级别开始并在 + (RKMapping *) 方法中为不同实体进行映射(可能不是)?

还有一个问题 .. 我如何从这个 JSON 访问 enablednumber_of_articles 属性?同样,我不是在处理一个结构良好的 Restful 响应,但我必须以某种方式处理它。我只想以某种方式访问​​这些属性...不需要映射到实体。

【问题讨论】:

    标签: ios mapping restkit


    【解决方案1】:

    RKManagedObjectRequestOperation 有方法 initWithRequest:responseDescriptors: 是有原因的。请特别注意responseDescriptors 上的“s”以及您传递数组的事实。这意味着您可以配置多个响应描述符,每个具有相同的路径模式但不同的键路径,RestKit 将在从服务器接收到的响应中处理它们中的每一个。

    请注意,当您执行此操作时,您可能想要更改您的NSLog(@"%@", mappingResult.array);,因为它将包含列表中的所有顶级项目。相反,您可能应该使用NSLog(@"%@", mappingResult.dictionary);

    【讨论】:

    • 谢谢!我真的很怀念那个 :)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2012-12-24
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多