2012-12-24 53 views
12

我想發送一個JSON請求使用AFNetworking,並有一個問題,使價值被翻譯成{"value": true} json形式。相反,我得到:{"value": 1}AFNetworking JSON請求與布爾值

這裏基本上我是如何創建請求:

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

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

我在這裏缺少一些小事? :)

+3

由於@YES是一個NSNumber,NSJSONSerialization將其變成0/1。我不認爲除了@ {@「value」:(yesOrNo?@「true」:@「false」)}或使用不同的序列化類以外,還有其他方法。 –

+0

@TalBereznitskey看起來像我的服務器的實現期望布爾值很好地處理了字符串值「true」/「false」!如果你將它作爲答案粘貼,我會接受它:) – abyx

回答

13

簡短回答: 請確保您正在運行的最新版本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]; 
+0

你是對的,這確實應該工作。原來,我的問題是由於我的核心數據模型,由於某些原因,不保留我的布爾屬性的「boolness」:)我感謝您的幫助! – abyx

+0

此外,我已經創建了一個有關該問題的問題:http://stackoverflow.com/q/14029473/573 – abyx

+0

這是我的問題:「作爲一個說明,一定不要在代碼中使用@(YES)作爲它會輸出爲1而不是真的。「所以,抱怨。 – livingtech

2

由於@YES是一個NSNumber,NSJSONSerialization將其變成0/1。

我不認爲除了@{@"value": (yesOrNo ? @"true" : @"false")}或使用不同的序列化類以外,還有其他方法。

+1

@YES是一個'NSNumber',但是它是基於一個BOOL值創建的(它相當於'[NSNumber numberWithBool:YES]',而'NSNumber'實例將「記住」它創建的類型,所以'NSJSONSerialization'會輸出正確的結果,你可以通過發送'objCType'消息到'NSNumber'實例來檢查返回的值,你會發現'@ YES'和'@ 1'(或'@ @ (YES)',for matter)。 – carlosfigueira

+1

「請注意,數字對象不一定保留它們的創建類型。」從文檔:https://developer.apple.com/library/mac/#documentation/Cocoa /Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html –

1

對於可能遇到此問題的人來說,還有一個原因可能會發生。

確保您的AFHTTPClient子類的parameterEncoding屬性設置爲AFJSONParameterEncoding,否則你會碰到沒有被正確檢測的NSNumber的初始值的問題,會看到0和1是通過輸出而不是編碼器。也可參考this

希望這會有所幫助。

+0

釘了它,謝謝:) –

0

在HTTPClient的子類中。相反的:

self.responseSerializer = [AFJSONResponseSerializer serializer]; 

嘗試:

$self.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments]; 
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]; 
帖子發送210

對我來說可行!