2009-10-05 18 views
5

मुझे जेएसओएन के बारे में कुछ भी नहीं पता है और मुझे केवल एक आईफोन का उपयोग करके सर्वर से अनुरोध भेजने और उससे आने वाले डेटा को पढ़ने की आवश्यकता है।JSON IPHONE: JSON अनुरोध कैसे भेजें और डेटा को सर्वर से खींचें?

मैं उपयोग करने के लिए कोशिश की है jason-framework करने के लिए है, लेकिन दस्तावेजों मैं यह पता लगाने की कैसे वस्तु का निर्माण और अनुरोध पर इसे भेजने के लिए सक्षम नहीं था पर खबर पढ़ने के बाद। तो मैंने एसओ पर यहां एक और कोड अनुकूलित करने का फैसला किया।

वस्तु की आवश्यकता यह है:

{ "कोड": xxx}

यहाँ मैं एक समस्या है। यह xxx एक एनएसडीटा है, इसलिए मुझे संदेह है कि मुझे इस डेटा को एक स्ट्रिंग में कनवर्ट करना है, फिर ऑब्जेक्ट बनाने और अनुरोध पर इसे भेजने के लिए इस स्ट्रिंग का उपयोग करें।

सर्वर प्रतिक्रिया भी रूप में एक JSON वस्तु है,

{ "जवाब": "yyy"} जहां yyy 10000 और 99999

बीच की एक संख्या है इस कोड को मैं इतना है दूर।

- (NSString *)checkData:(NSData) theData { 
    NSString *jsonObjectString = [self encode:(uint8_t *)theData length:theData.length];  
    NSString *completeString = [NSString stringWithFormat:@"http://www.server.com/check?myData=%@", jsonObjectString];        
    NSURL *urlForValidation = [NSURL URLWithString:completeString];    
    NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];       
    [validationRequest setHTTPMethod:@"POST"];    
    NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil]; 
    [validationRequest release]; 
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding]; 
    NSInteger response = [responseString integerValue]; 
    NSLog(@"%@", responseString); 
    [responseString release]; 
    return responseString; 
} 


- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length { 
    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

    NSMutableData *data = [NSMutableData dataWithLength:((length + 2)/3) * 4]; 
    uint8_t *output = (uint8_t *)data.mutableBytes; 

    for (NSInteger i = 0; i < length; i += 3) { 
     NSInteger value = 0; 
     for (NSInteger j = i; j < (i + 3); j++) { 
      value <<= 8; 

      if (j < length) { 
       value |= (0xFF & input[j]); 
      } 
     } 

     NSInteger index = (i/3) * 4; 
     output[index + 0] = table[(value >> 18) & 0x3F]; 
     output[index + 1] =     table[(value >> 12) & 0x3F]; 
     output[index + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '='; 
     output[index + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '='; 
    } 

    ret 

    urn [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; 
} 

यह सब कोड मुझे त्रुटियां देता है। या बीएडी यूआरएल या जावा अपवाद।

इस कोड के साथ क्या गलत है?

तुम लोगों json-framework का उपयोग कर कृपया मुझे बताओ कैसे है कि जोड़ी ("कोड", "मेरी NSData यहाँ स्ट्रिंग के लिए परिवर्तित") का उपयोग वस्तु एन्कोड करने के लिए एक और समाधान देने के लिए ...

धन्यवाद पसंद करते हैं किसी भी मदद के लिए।

उत्तर

17

JSON ढांचा Arrays, शब्दकोश, स्ट्रिंग्स, संख्याओं और बूलियन को परिवर्तित करने का समर्थन करता है। तो आप अपने डेटा को इन प्रारूपों में से किसी एक में परिवर्तित करना चाहते हैं। चूंकि आपका डेटा NSData है सबसे आसान तरीका है के साथ इसे परिवर्तित करने के लिए है:

NSString* stringData = [[NSString alloc] initWithData:yourData 
              encoding:NSUTF8StringEncoding]; 

क्या (और अपने सर्वर इसे संभाल कर सकते हैं अगर) बफर में है के आधार पर आप Base64 कर सकते हैं परिणाम (जाँच http://www.cocoadev.com/index.pl?BaseSixtyFour अगर आप डॉन 'सांकेतिक शब्दों में बदलना टी कनवर्टर आसान है)। आप सीधे NSData से बेस 64-एन्कोडेड स्ट्रिंग पर जा सकते हैं।

अब कुंजी code साथ एक आइटम और मूल्य stringData (अंतिम चरण से) के साथ एक शब्दकोश बनाने के लिए:

NSDictionary* jsonDictionary = [NSDictionary dictionaryWithObject:stringData 
                  forKey:@"code"]; 

यह आसानी से JSON में बदला जा सकता। बस अपने कोड शीर्षक में JSON.h आयात करते हैं, तो का उपयोग करें:

NSString* jsonString = [jsonDictionary JSONRepresentation]; 

यह डंप बाहर है और आप अपने JSON स्ट्रिंग देखेंगे - कुछ इस तरह: {"code" : "{yourstringdata}"; }। अपने सर्वर पर इसे भेजने का सबसे आसान तरीका एक पोस्ट विधि के साथ ASIHTTPRequest लाइब्रेरी का उपयोग करना है।

एक बार जब आप परिणाम सर्वर से वापस मिल JSON ढांचे इसे वापस पार्स कर सकते हैं एक शब्दकोश में और फिर आप अपनी आवश्यकता का डेटा बाहर निकल सकते हैं:

NSDictionary* responseDict = [yourJSONResponseStringFromServer JSONValue]; 
NSNumber* answerNum = (NSNumber *) [responseDict objectForKey:@"answer"]; 
int answer = [answerNum intValue]; 
+0

धन्यवाद !!!!!! बस!ASIHTTPRequest लाइब्रेरी प्रलेखन बहुत अपूर्ण और सतही है (आपकी गलती नहीं), लेकिन मैं इसे आपके निर्देशों का उपयोग करके काम करने में कामयाब रहा। उत्तम! तुम डी आदमी हो! – SpaceDog

+0

खुशी है कि यह आपके लिए काम करता है। ASIHTTPRequest पर मत छोड़ो। एक बार जब आप इसे लटका लेंगे तो यह बहुत सरल है। केवल एक चीज है, setDidFinishSelector/setDidFailSelector विधियों को प्रदान करना न भूलें और प्रतिनिधि सेट करें ताकि नेटवर्किंग विफल होने पर आपको अधिसूचित किया जा सके। वहां बहुत सारे सेल मृत-क्षेत्र हैं। – Ramin

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