2012-12-24 45 views
12

Tôi đang cố gắng gửi yêu cầu JSON bằng cách sử dụng AFNetworking và có vấn đề với việc tạo các giá trị được dịch sang dạng json là {"value": true}. Thay vào đó, tôi nhận được: {"value": 1}Yêu cầu JSON nối mạng với boolean

Đây là cơ bản như thế nào tôi là tạo ra các yêu cầu:

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

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

Am tôi thiếu một cái gì đó tầm thường ở đây? :)

+3

Vì @YES là một NSNumber, NSJSONSerialization biến điều này thành 0/1. Tôi không nghĩ rằng có một cách khác hơn @ {@ "giá trị": (yesOrNo? @ "True": @ "false")} hoặc sử dụng một lớp tuần tự khác. –

+0

@TalBereznitskey Có vẻ như việc triển khai máy chủ của tôi đang chờ xử lý boolean độc đáo với giá trị chuỗi là "true"/"false"! Nếu bạn dán nó như là một câu trả lời tôi sẽ chấp nhận nó :) – abyx

Trả lời

13

Câu trả lời ngắn: Đảm bảo bạn đang chạy phiên bản mới nhất AFNetworking. Đó là tất cả những gì tôi có thể xem là vấn đề dựa trên mã bạn đã cung cấp.

Câu trả lời dài: Tôi đã cố gắng sao chép sự cố bạn đang mô tả bằng các phiên bản mới nhất của AFNetworking và tôi không thể. Tôi đào sâu vào AFNetworking để xem cách mã hóa JSON được thực hiện. AFHTTPClient.m:442 sử dụng NSJSONSerialization để mã hóa các yêu cầu JSON. Tôi đã đưa ra đoạn mã sau để kiểm tra vấn đề này:

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]); 

kết quả đầu ra:

{"value":true} 

Vì vậy @YES nên làm nó. Lưu ý, hãy chắc chắn không phải để sử dụng @(YES) trong mã của bạn vì nó sẽ xuất ra dưới dạng 1 thay vì true.

NSError* error = nil; 
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:@{@"value" : @(YES)} options:0 error:&error]; 
NSLog(@"JSON:%@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]); 

kết quả đầu ra:

{"value":1} 

Với mà tôi đã trải qua và cố gắng tìm ra cách AFHTTPClient cần phải được cấu hình để gửi ra một bool như 1/0 thay vì true/false và không thể tìm thấy bất kì. Đây là mã mạng của tôi.

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]; 
+0

Bạn đang chính xác, điều này thực sự chỉ nên làm việc. Hóa ra rằng vấn đề của tôi là kết quả từ mô hình dữ liệu cốt lõi của tôi mà vì một số lý do không giữ lại "boolness" của tài sản boolean của tôi :) Cảm ơn sự giúp đỡ! – abyx

+0

Ngoài ra, tôi đã tạo một câu hỏi về vấn đề đó: http://stackoverflow.com/q/14029473/573 – abyx

+0

Đây là vấn đề của tôi: "Lưu ý, hãy đảm bảo không sử dụng @ (YES) trong mã của bạn nó sẽ xuất thành 1 thay vì đúng. " RẤT BỰC BỘI. – livingtech

2

Vì @YES là NSNumber, NSJSONSerialization biến điều này thành 0/1.

Tôi không nghĩ có cách nào khác ngoài @{@"value": (yesOrNo ? @"true" : @"false")} hoặc sử dụng một lớp tuần tự hóa khác.

+1

@YES là một 'NSNumber', nhưng nó được tạo dựa trên giá trị BOOL (nó tương đương với' [Số NSNumberWithBool: YES] '. Và cá thể' NSNumber' sẽ "nhớ" kiểu mà nó được tạo ra, vì vậy 'NSJSONSerialization' sẽ xuất ra điều đúng.Bạn có thể kiểm tra giá trị trả về bằng cách gửi thông điệp' objCType' tới cá thể 'NSNumber', và bạn sẽ thấy' @ YES' khác với '@ 1' (hoặc' @ (YES) ', cho rằng vấn đề) – carlosfigueira

+1

" Lưu ý rằng các đối tượng số không nhất thiết phải bảo tồn loại chúng được tạo ra. "Từ tài liệu: https://developer.apple.com/library/mac/#documentation/Cocoa /Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html –

1

Đối với những người có thể gặp sự cố này, có một lý do khác khiến nó có thể xảy ra.

Đảm bảo bạn đặt thuộc tính parameterEncoding của AFHTTPClient phân lớp thành AFJSONParameterEncoding, nếu không bạn sẽ gặp phải vấn đề giá trị khởi tạo của NSNumber không được phát hiện chính xác và sẽ thấy 0 và 1 là đầu ra thay vì bộ mã hóa.

Xem this để tham khảo.

Hy vọng điều này sẽ hữu ích.

+0

Đóng đinh nó, cảm ơn :) –

0

Trong phân lớp của HTTPClient.Thay vì:

self.responseSerializer = [AFJSONResponseSerializer serializer]; 

thử với:

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

Tôi đã cùng một lỗi, tôi đang gửi @YES nhưng các dịch vụ cung cấp cho tôi thất bại, vì vậy tôi tạo ra và chuỗi của một json và tạo ra một JSONObject như thế này:

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]; 

Sử dụng đối tượng này để gửi bài với AFNetworking

[self postParameters:object]; 

cho tôi hoạt động!

Các vấn đề liên quan