iOS NSJSONSerialization为POST请求序列化时将NSDictionary嵌套为键

iOS NSJSONSerialization为POST请求序列化时将NSDictionary嵌套为键,ios,objective-c,json,post,Ios,Objective C,Json,Post,我试图将一些数据发布到我正在运行的RoR服务器,但在序列化后如何格式化我试图发送的NSDictionary方面遇到了问题 这是我的目标C代码: - (void)registerUser:(NSString *)provider uid:(NSString *)uid inviteCode:(NSString *)inviteCode userInfo:(NSDictionary *)userInfo { NSLog(@"Attempting to register us

我试图将一些数据发布到我正在运行的RoR服务器,但在序列化后如何格式化我试图发送的NSDictionary方面遇到了问题

这是我的目标C代码:

- (void)registerUser:(NSString *)provider uid:(NSString *)uid
         inviteCode:(NSString *)inviteCode userInfo:(NSDictionary *)userInfo
{
    NSLog(@"Attempting to register user");

    // Construct the data to post
    NSDictionary *post = @{
        @"provider": provider,
        @"uid": uid,
        @"invite_code": inviteCode,
        @"user_info": userInfo
    };
    // TODO need to format better so it works with rails
    NSData *data = [NSJSONSerialization dataWithJSONObject:post options:0 error:nil];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:_registerUserURL]];
    [request setHTTPMethod:@"POST"];

    NSURLSession *session = [NSURLSession sessionWithConfiguration:_defaultConfig];
    NSURLSessionUploadTask *task = [session uploadTaskWithRequest: request
            fromData: data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"%@", json);
    }];

    [task resume];
}
我希望它以以下格式将数据发布到我的RoR服务器:

{\user\u info\:{\name\:\Matt Fornaciari\,\email\:\mattforni@gmail.com\,\city\:\San Francisco,California\,\provider\:\facebook\,\uid\:\10202835053250675\,\invite\u code\:\a\}

但是,序列化过程似乎嵌套了我的字典:

2014-12-09T04:20:14.366921+00:00 app[web.1]: Started POST "/users/register" for 67.160.200.20 at 2014-12-09 04:20:14 +0000
2014-12-09T04:20:14.439711+00:00 app[web.1]: Completed 400 Bad Request in 22ms (Views: 0.2ms | ActiveRecord: 0.0ms)
2014-12-09T04:20:14.417370+00:00 app[web.1]: Processing by UsersController#register as */*
2014-12-09T04:20:14.417422+00:00 app[web.1]:   Parameters: {"{\"user_info\":{\"name\":\"Matt Fornaciari\",\"email\":\"mattforni@gmail.com\",\"city\":\"San Francisco, California\"},\"provider\":\"facebook\",\"uid\":\"10202835053250675\",\"invite_code\":\"a\"}"=>nil}

所以我的所有数据都到达了,但它作为一个键嵌套在另一个映射中,该键指向一个nil值,使得Ruby无法读取所有数据。有没有人经历过这种情况并有什么建议?

因此,NSJSONSerialization似乎无法很好地将JSON发送到rails应用程序。我可以通过从字符串手动创建NSData对象来解决这个问题。下面是我用来编码参数的代码

// Construct the data to post
NSString *post = [NSString stringWithFormat:
    @"provider=%@&uid=%@&invite_code=%@&user_info[name]=%@&user_info[email]=%@&user_info[city]=%@",
    provider, uid, inviteCode, userInfo[@"name"], userInfo[@"email"], userInfo[@"city"]
];
NSData *data = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

// Create and send the request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:_registerUserURL]];
[request setHTTPMethod:@"POST"];
NSURLSession *session = [NSURLSession sessionWithConfiguration:_defaultConfig];
NSURLSessionUploadTask *task = [session uploadTaskWithRequest: request
        fromData: data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSLog(@"%@", json);
}];

我也遇到了同样的问题,这是一个非常简单的解决方法。您只需要在请求中将内容类型设置为application/json,否则您的HTTP请求将无法正确解释,并导致此奇怪的错误

要解决此问题,可以在原始帖子中调用setHTTPMethod后添加以下行:


[请求设置值:@application/json-forHTTPHeaderField:@Content-Type]

请稍等,我正在尝试你的代码,过一会儿会让你知道…你能给我你的URL吗,我需要调用它来尝试你的代码…确保包含“www”,否则你会得到重定向。我得到一个无效URL的错误。。。