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];
【讨论】:
您也可以使用AFHTTPClient
的setParameterEncoding
而不必设置其中的一些标头。以上是关于AFNetworking POST 格式错误的 JSON - 单引号和 [Object] 参考的主要内容,如果未能解决你的问题,请参考以下文章
使用 AFNetworking 的 POST 请求出现错误 404
AFNetworking 2.0:多部分 POST 时出现错误 503
如何使用 AFNetworking 查看 json POST 的错误?