14

我正在尝试使用 AFNetworking 发送 JSON 请求,但在将值转换为 .json 格式时遇到问题{"value": true}。相反,我得到:{"value": 1}

这基本上是我创建请求的方式:

NSMutableURLRequest *request =
    [self.httpClient requestWithMethod:@"POST"
                                  path:url
                            parameters:@{@"value": @YES}];

AFJSONRequestOperation *operation =
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request ...];
    [operation start];

我在这里错过了一些微不足道的事情吗?:)

4

5 回答 5

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),因为它会输出为 a1而不是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];
于 2012-12-24T18:19:06.633 回答
3

因为@YES 是一个NSNumber,NSJSONSerialization 把它变成0/1。

我认为除了@{@"value": (yesOrNo ? @"true" : @"false")}或使用不同的序列化类之外没有其他方法。

于 2012-12-24T18:52:26.120 回答
1

对于可能遇到此问题的人来说,可能还有另一个原因。

确保将子类的parameterEncoding属性设置为,否则会遇到 NSNumber 的初始化值未被正确检测到的问题,并且会看到编码器输出 0 和 1。AFHTTPClientAFJSONParameterEncoding

请参阅内容以供参考。

希望这可以帮助。

于 2013-07-28T00:20:34.310 回答
0

在 HTTPClient 的子类中。代替:

self.responseSerializer = [AFJSONResponseSerializer serializer];

尝试:

$self.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
于 2016-02-28T15:08:33.313 回答
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];

对我有用!

于 2017-01-06T17:23:21.283 回答