【问题标题】:AFNetworking JSON request with a boolean带有布尔值的 AFNetworking JSON 请求
【发布时间】:2012-12-11 00:09:49
【问题描述】:

我正在尝试使用 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];

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

【问题讨论】:

  • 由于 @YES 是一个 NSNumber,NSJSONSerialization 将其变为 0/1。我认为除了@{@"value": (yesOrNo ?@"true" : @"false")} 或使用不同的序列化类之外没有其他方法。
  • @TalBereznitskey 看起来我的服务器实现期望一个布尔值很好地处理“true”/“false”的字符串值!如果您将其粘贴为答案,我会接受:)

标签: iphone ios json afnetworking


【解决方案1】:

我有同样的错误,我正在发送@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];

对我有用!

【讨论】:

    【解决方案2】:

    在 HTTPClient 的子类中。而不是:

    self.responseSerializer = [AFJSONResponseSerializer serializer];
    

    尝试:

    $self.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
    

    【讨论】:

      【解决方案3】:

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

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

      请参阅this 以供参考。

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        由于@YES 是一个 NSNumber,NSJSONSerialization 将其变为 0/1。

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

        【讨论】:

        • @YES 是 NSNumber,但它是基于 BOOL 值创建的(它相当于 [NSNumber numberWithBool:YES]NSNumber 实例将“记住”创建它的类型,所以NSJSONSerialization 会输出正确的东西。您可以通过将objCType 消息发送到NSNumber 实例来检查返回的值,您会看到@YES@1 不同(或@987654331 @,就此而言)。
        • "请注意,数字对象不一定保留创建它们的类型。"来自文档:developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
        【解决方案5】:

        简答: 确保您运行的是最新版本的 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 配置为以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];
        

        【讨论】:

        • 你是对的,这确实应该有效。原来我的问题是由我的核心数据模型引起的,由于某种原因它没有保留我的布尔属性的“boolness”:) 感谢您的帮助!
        • 另外,我创建了一个关于该问题的问题:stackoverflow.com/q/14029473/573
        • 这是我的问题:“请注意,请务必不要在代码中使用 @(YES),因为它会输出 1 而不是 true。”太令人沮丧了。
        • Afnetworking 3.0中没有setParameterEncoding,你现在如何处理?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        • 2011-11-29
        • 2014-03-22
        • 1970-01-01
        相关资源
        最近更新 更多