2012-12-24 21 views
12

मैं AFNetworking का उपयोग कर JSON अनुरोध भेजने की कोशिश कर रहा हूं और {"value": true} के जेसन रूप में मूल्यों का अनुवाद करने में समस्या है। इसके बजाय, मैं हो रही है: {"value": 1}एएफनेटवर्किंग JSON अनुरोध एक बूलियन

यहाँ कैसे मैं अनुरोध बना रहा हूं मूल रूप से बताया गया है:

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

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

Am मैं यहाँ कुछ तुच्छ याद आ रही? :)

+3

चूंकि @YES एक NSNumber है, NSJSONSerialization इसे 0/1 पर बदल देता है। मुझे नहीं लगता कि @ {@ "value" के अलावा कोई तरीका है: (yesOrNo? @ "True": @ "false")} या एक अलग धारावाहिक वर्ग का उपयोग करना। –

+0

@TalBereznitskey मेरे सर्वर के कार्यान्वयन की तरह दिखता है जो एक बुलियन की अपेक्षा करता है कि वह "सत्य"/"झूठी" के स्ट्रिंग मान को अच्छी तरह से संभालता है! यदि आप इसे उत्तर के रूप में पेस्ट करेंगे तो मैं इसे स्वीकार करूंगा :) – abyx

उत्तर

13

संक्षिप्त उत्तर: सुनिश्चित करें कि आप AFNetworking का हालिया संस्करण चला रहे हैं। आपके द्वारा प्रदान किए गए कोड के आधार पर मैं समस्या के रूप में देख सकता हूं।

लांग जवाब: मैं इस मुद्दे आप AFNetworking के नवीनतम संस्करणों के साथ का वर्णन कर रहे हैं प्रजनन की कोशिश की है और मैं नहीं कर सके। मैंने जेएसओएन का एन्कोडिंग कैसे किया है यह देखने के लिए एएफनेटवर्किंग में खोला। JSON अनुरोधों को एन्कोड करने के लिए AFHTTPClient.m:442NSJSONSerialization का उपयोग करता है।

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) का उपयोग करने के लिए true के बजाय 1 के रूप में आउटपुट करेगा।

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 के रूप में एक bool बाहर भेजने की कोशिश की के साथ

और नहीं पा सके कोई। मेरा नेटवर्किंग कोड यहाँ है।

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

आप सही हैं, यह वास्तव में काम करना चाहिए। यह पता चला है कि मेरी समस्या मेरे कोर डेटा मॉडल से उत्पन्न होती है जो किसी कारण से मेरी बूलियन संपत्ति के "बूलनेस" को बरकरार नहीं रखती है :) मदद के लिए धन्यवाद! – 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' है, लेकिन यह एक बूल वैल्यू के आधार पर बनाया गया है (यह' [NSNumber numberWithBool: YES] 'के समतुल्य है। और 'NSNumber' उदाहरण उस प्रकार को याद रखेगा जिस प्रकार से इसे बनाया गया था, इसलिए 'NSJSONSerialization' सही चीज़ का उत्पादन करेगा। आप' objCType' संदेश को 'NSNumber' उदाहरण में भेजकर लौटाए गए मान की जांच कर सकते हैं, और आप देखेंगे कि' @ YES' '1' से अलग है (या' @ (हां) ', उस मामले के लिए) – carlosfigueira

+1

" ध्यान दें कि संख्या ऑब्जेक्ट्स आवश्यक रूप से उनके द्वारा बनाए गए प्रकार को संरक्षित नहीं करते हैं। "दस्तावेज़ से: https://developer.apple.com/library/mac/#documentation/Cocoa /Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html –

1

जो लोग इस मुद्दे पर चल रहे हैं, उनके लिए एक और कारण हो रहा है कि ऐसा क्यों हो रहा है।

आप AFJSONParameterEncoding करने के लिए अपने AFHTTPClient उपवर्ग के parameterEncoding गुण सेट सुनिश्चित करें, अन्यथा आप सही ढंग से पता लगाया नहीं किया जा रहा NSNumber के प्रारंभ मूल्य के मुद्दे में चलाने देंगे, और 0s और 1s बजाय इनकोडर द्वारा उत्पादन किया जा रहा है देखेंगे।

संदर्भ के लिए this देखें।

उम्मीद है कि इससे मदद मिलती है।

+0

इसे खींचा, धन्यवाद :) –

0

HTTPClient के उप-वर्ग में।बजाय:

self.responseSerializer = [AFJSONResponseSerializer serializer]; 

के साथ प्रयास करें:

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

मैं एक ही त्रुटि है, मैं @YES भेज रहा हूँ, लेकिन सेवाओं मुझे असफल दे, तो मैं बना सकते हैं और एक json की स्ट्रिंग और एक बनाने इस तरह JSONObject: AFNetworking

साथ
[self postParameters:object]; 
पोस्ट भेजने के लिए इस वस्तु

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

उपयोग मेरे लिए 210

काम करता है!

संबंधित मुद्दे