JSON for ManagedObject中没有引号?

时间:2014-04-04 20:53:46

标签: json restkit-0.20

在阅读文档和发布对象的示例代码时,我一定错过了与序列化实体相关的内容。似乎可以将实体发送到postObject并期望它使用提供的映射来生成JSON并将其发布到服务器。

我已经能够映射和发布一个对象,但是JSON并没有很好地形成。

我已经能够手动参数化对象并获得有效的JSON。我即将深入研究源代码,但想知道我错过了什么。

这是我看到的代码和结果。洞察/帮助表示赞赏!

我有以下托管对象:

@interface TFUser : NSManagedObject

@property (nonatomic, retain) NSString * first_name;
@property (nonatomic, retain) NSString * last_name;

@end

我有以下代码来映射它:

+(RKEntityMapping *) mapping
{
  if (_mapping == nil)
  {
    RKObjectManager *objectManager = [RKObjectManager sharedManager];
    assert(objectManager && "Object manager not initialized!?");

    RKManagedObjectStore *managedObjectStore = objectManager.managedObjectStore;
    assert(objectManager && "No object store!?");

    // USER Entity Map
    _mapping = [RKEntityMapping mappingForEntityForName:@"TFUser"
                                   inManagedObjectStore:managedObjectStore];
    [_mapping addAttributeMappingsFromDictionary:@{
                                                   @"first_name": @"first_name",
                                                   @"last_name": @"last_name"
                                                   }];
    _mapping.identificationAttributes = @[ @"first_name" ];
  }

  return _mapping;
}

我有以下代码来测试直接序列化一个受管对象:

  TFUser *user = (TFUser*) [self.managedObjectContext insertNewObjectForEntityForName:@"TFUser"];
  user.first_name = @"Mickey";
  user.last_name = @"Mouse";

  NSError *error;
  RKRequestDescriptor *requestDescriptor =
  [RKRequestDescriptor requestDescriptorWithMapping:[TFUser.mapping inverseMapping]
                                        objectClass:[TFUser class]
                                        rootKeyPath:@"user"
                                             method:RKRequestMethodAny];

  NSDictionary *parameters = [RKObjectParameterization parametersWithObject:user
                                                          requestDescriptor:requestDescriptor
                                                                      error:&error];

  NSData *jsonData= [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
  NSString *message = [[NSString alloc] initWithData:jsonData encoding:NSASCIIStringEncoding];

  NSLog(@"USER JSON:\r\n%@", message);

这产生了我所期望的:

USER JSON:
{
  "user" : {
    "first_name" : "Mickey",
    "last_name" : "Mouse"
  }
}

当我直接postObject对象时:

  [[RKObjectManager sharedManager] postObject:user
                                         path:@"/user"
                                   parameters:nil
                                      success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                        NSLog(@"Success");
                                      }
                                      failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                        NSLog(@"Error");
                                      }];

服务器收到:

{ user: { first_name: 'Mickey', last_name: 'Mouse' } }

解析器抱怨它无法处理JSON。

为什么我会得到不同的结果?如何让帖子为服务器生成正确的JSON?

谢谢! - 凯文

1 个答案:

答案 0 :(得分:0)

代码一直在工作。调试和服务器上的一些代码被破坏了。

通过仔细检查发送到服务器的正文请求的日志记录,很明显JSON格式良好,离开了客户端。这是:

request.headers={
    Accept = "application/json";
    "Accept-Language" = "en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5";
    "Content-Type" = "application/json; charset=utf-8";
    "User-Agent" = "Treefort/1.0 (iPhone Simulator; iOS 7.0.3; Scale/2.00)";
}
request.body={
  "user" : {
    "first_name" : "Mickey",
    "last_name" : "Mouse"
  }
}

服务器上的代码是这样做的:

            console.log req.body                                                                                                                                              
            request = JSON.parse req.body                                                                                                                                     
            user = request.user                                                                                                                                               

JSON在到达此处时已经被处理为对象。这意味着日志行将对象转储到日志,而不是接收到的正文的文本。第二个问题是没有理由明确请求正文的JSON解析。它已被转换为对象。

要解决此问题,我只需将代码更改为:

        user = req.body.user

有时别人说...它应该有效。几天来,我一直在喋喋不休。谢谢!