AFNetworking POST 格式错误的 JSON - 单引号和 [Object] 参考

Posted

技术标签:

【中文标题】AFNetworking POST 格式错误的 JSON - 单引号和 [Object] 参考【英文标题】:AFNetworking POSTing malformed JSON - single quotes and [Object] refs 【发布时间】:2012-03-05 06:22:21 【问题描述】:

我正在使用 AFNetworking,我正在尝试发布 JSON 结构。问题是它不是"my_property":"my value",而是将其格式化为my_property:'my_value'。我猜在大多数情况下,第一组引号的丢失是可以的,但我不确定如何处理非 JSON 单引号,并且很困惑为什么它会生成单引号,因为它知道它从 NSDictionary 创建 JSON。此外,它还包括 [Object] 引用,我只期望一个“”。这是服务器得到的:

...
num_matches: 32,
view_instance: properties_in_view: [Object],
[  view_instance_ctr: 0, view_id: '4e5bb37258200ed9aa000011' ,
...

目标是 ios 5.0,所以我假设它使用 NSJSONSerialization 来创建 JSON(尽管我还没有尝试验证这一点)。我发送的字典使用 isValidJSONObject 验证到 JSON。如果我打印出序列化版本,它看起来很棒。代码的简化版本如下:

NSDictionary *params = myDictionaryThatValidatesToJSON;
httpClient.parameterEncoding = AFJSONParameterEncoding;
NSMutableURLRequest *request = [httpClient 
     requestWithMethod:@"POST" path:@"" parameters:params];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation start];

我希望我缺少 bigDummy = NO 标志。

【问题讨论】:

【参考方案1】:

我认为您的问题出在服务器端 - 即。您在问题中引用的调试不是服务器接收到的原始 JSON 文本,而是服务器上的某些组件对此进行了重新解释。

【讨论】:

我很确定这是服务器上收到的内容,但我会仔细检查。请注意,我可以使用 Firefox REST 插件成功发送相同的 JSON,并且确实记录的数据都是双引号。还有一点需要注意:我之前已经成功地将其他数据发送到服务器上的其他 POST API,但我总是用我创建的一个大字符串初始化一个字典,该字符串转义了双引号。我现在会尝试看看它是否有任何区别,并确保它不会是服务器问题。谢谢。 另一种选择是,如果 JSON 序列化程序确实在生成 [Object],那么您的字典中肯定有一个不寻常的对象 我不太了解 AFNetworking,尽管它说如果可用,它将使用 NSJSONSerialization。如果我这样做: NSData* jsonData = [NSJSONSerialization dataWithJSONObject:outDict options:NSJSONWritingPrettyPrinted error:&error]; NSString *jsonOut = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];它生成有效的 JSON。我正在以编程方式创建 JSON,它非常简单,所以我认为我没有引入任何奇怪的东西。 所以,如果我使用我的原始字典,对其进行序列化,然后从序列化的内容创建一个新字典,它就可以工作(以正确格式进入服务器)。我想知道 AFNetworking 是否可能实际上并没有使用 NSJSONSerialization 来序列化输出,而是使用备份库(我在项目中也有 SBJSON)? 好吧,我想第一个问题是如果你明确调用 SBJSON,它会返回相同的奇怪字符串吗?您还可以使用调试器单步执行 AFNetworking 并查看它实际调用的内容。【参考方案2】:

迈克尔是正确的。通过使用他的数据代码,我使用它来执行带有 JSOn 参数的 POST 请求:

// dataDictionary 是你的参数字典

    NSError *error = nil;

    NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dataDictionary options:NSJSONWritingPrettyPrinted error:&error];

    //NSString *jsonOut = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:webURL]];

    [httpClient setParameterEncoding:AFFormURLParameterEncoding];

    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST"
                                                            path:@"Webservice URL"
                                                      parameters:nil];

    NSMutableData *body = [NSMutableData data];

    [body appendData:jsonData];

    [request setHTTPBody:body];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/json" forHTTPHeaderField:@"content-type"];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 

        // Print the response body in text

        NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);


     failure:^(AFHTTPRequestOperation *operation, NSError *error) 

        NSLog(@"Error: %@", error);


    ];
    [operation start];

【讨论】:

您也可以使用AFHTTPClientsetParameterEncoding 而不必设置其中的一些标头。

以上是关于AFNetworking POST 格式错误的 JSON - 单引号和 [Object] 参考的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 的 POST 请求出现错误 404

AFNetworking 2.0:多部分 POST 时出现错误 503

如何使用 AFNetworking 查看 json POST 的错误?

AFNetworking 2.0 POST 请求无法快速工作

AFNetworking 和 POST 请求

AFNetworking POST 写入服务器并返回失败错误(Cocoa 错误 3840)