我正在尝试使用AFNetworking发送JSON请求,并且在将值转换为{"value": true}
的json形式时遇到问题。相反,我得到了:{"value": 1}
这基本上就是我创建请求的方式:
NSMutableURLRequest *request =
[self.httpClient requestWithMethod:@"POST"
path:url
parameters:@{@"value": @YES}];
AFJSONRequestOperation *operation =
[AFJSONRequestOperation JSONRequestOperationWithRequest:request ...];
[operation start];
我在这里错过了一些小事吗? :)
答案 0 :(得分:14)
简答: 确保您运行的是最新版本的AFNetworking。根据你提供的代码,这就是我所能看到的问题。
答案很长: 我已尝试使用最新版本的AFNetworking重现您所描述的问题,但我无法做到。我挖掘AFNetworking以了解JSON的编码是如何完成的。 AFHTTPClient.m:442使用NSJSONSerialization对JSON请求进行编码。我想出了以下代码来测试这个问题:
NSError* error = nil;
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:@{@"value" : @YES} options:0 error:&error];
NSLog(@"Resulting JSON:\n\n%@\n", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
输出:
{"value":true}
所以@YES
应该这样做。请注意,请确保不在代码中使用@(YES)
,因为它会以1
而不是true
输出。
NSError* error = nil;
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:@{@"value" : @(YES)} options:0 error:&error];
NSLog(@"JSON:%@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
输出:
{"value":1}
有了这个,我试着弄清楚如何配置AFHTTPClient来发送一个bool 1
/ 0
而不是true
/ false
和找不到任何东西。这是我的网络代码。
AFHTTPClient* httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://<SERVER HERE>"]];
[httpClient setParameterEncoding:AFJSONParameterEncoding];
NSMutableURLRequest *jsonRequest = [httpClient requestWithMethod:@"POST" path:@"/" parameters:@{@"value": @YES}];
AFHTTPRequestOperation *jsonOperation = [AFJSONRequestOperation JSONRequestOperationWithRequest:jsonRequest success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"Success");
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"Failure");
}];
[jsonOperation start];
答案 1 :(得分:3)
由于@YES是NSNumber,因此NSJSONSerialization将其转换为0/1。
我认为除了@{@"value": (yesOrNo ? @"true" : @"false")}
或使用不同的序列化类之外,还有其他方法。
答案 2 :(得分:1)
对于可能遇到此问题的人来说,还有另一个可能发生这种情况的原因。
确保将parameterEncoding
子类的AFHTTPClient
属性设置为AFJSONParameterEncoding
,否则您将遇到NSNumber的初始化值未被正确检测到的问题,并且会看到0而编码器则输出1s。
请参阅this以供参考。
希望这有帮助。
答案 3 :(得分:0)
在HTTPClient的子类中。而不是:
self.responseSerializer = [AFJSONResponseSerializer serializer];
尝试:
$self.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
答案 4 :(得分:0)
我有同样的错误,我发送了@YES,但服务给了我失败,所以我创建了一个json的字符串并创建了一个像这样的jsonObject:
NSString* paramsString = @"{";
NSString* appending = [NSString stringWithFormat:@"\"%@\":%@,", KEY_CHECKED, (checked ? @"true" : @"false")];
paramsString = [paramsString stringByAppendingString: appending];
paramsString = [paramsString stringByAppendingString:@"}"];
id object = [NSJSONSerialization JSONObjectWithData:[paramsString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
使用此对象通过AFNetworking发送帖子
[self postParameters:object];
对我有用!