2012-04-12 14 views
9

को मैं नीचे JSON डेटा को डिकोड करने की उम्मीद:डिकोड JSON NSArray या NSDictionary

{ 
    "content": 
    [ 
     { 
      "1":"a", 
      "2":"b", 
      "3":"c", 
      "4":"d", 
      "mark":"yes" 
     } 
    ] 
} 

सुनिश्चित नहीं हैं कि अगर यह NSArray में डाल या NSDictionary

कोई टिप्पणी

+8

[आपने क्या प्रयास किया है?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) – vikingosegundo

उत्तर

29

जो आईओएस संस्करण आप उपयोग कर रहे हैं? आईओएस 5 में आपके पास JSON डेटा को पार्स करने के लिए NSJSONSerialization क्लास है, यदि आपको पुराने आईओएस या मैक ओएसएक्स को लक्षित करने की आवश्यकता है तो आपको SBJSON जैसे तीसरे पक्ष की lib का उपयोग करना चाहिए। पोस्ट की गई स्ट्रिंग एक शब्दकोश के साथ एक सरणी के साथ एक NSDictionary होगा। सरणी कुंजी @"content"

कोड में उपयोग करते हुए सुलभ हो जाएगा:

NSString * jsonString = @"blblblblblb"; 
NSStringEncoding encoding; 
NSData * jsonData = [jsonString dataUsingEncoding:encoding]; 
NSError * error=nil; 
NSDictionary * parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error]; 

स्विफ्ट 2.0 में:

let jsonString = "blblblblblb" 
    let encoding = NSUTF8StringEncoding 
    let jsonData = jsonString.dataUsingEncoding(encoding) 
    guard let jData = jsonData else {return} 
    do { 
     let parsedData = try NSJSONSerialization.JSONObjectWithData(jData, options: []) 
    } catch let error { 
     print("json error: \(error)") 
    } 

[अद्यतन] NSJSONSerialization वर्ग भी 10.7 मेरी टिप्पणी नहीं दिया के लिए उपलब्ध है सही नहीं है।

+1

यह नहीं कहता कि यह आईओएस के लिए है ... – hypercrypt

+0

क्षमा करें टैग उद्देश्य सी है, जिस तरह से आपने केवल आईओएस 5 पर उपलब्ध कक्षा का उपयोग किया ;-) – Andrea

+0

बिल्कुल, इसलिए इसे आईओएस होना जरूरी नहीं है। 'एनएसजेएसओएसरियलाइजेशन' ओएस एक्स 10.7 में भी उपलब्ध है। – hypercrypt

0

आप निम्न कर सकते हैं आपका स्वागत है :

NSData *data = ...; //JSON data 
NSError *jsonError = nil; 
[NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; 

आप एकयुक्त एक NSDictionary वापस मिल जाएगामें एक NSDictionary युक्त पांच NSString ऑब्जेक्ट्स शामिल हैं।

3

कि विशेष स्ट्रिंग एक NSDictionary में डिकोड जाएगा, क्योंकि सबसे बाहरी बात एक JSON ऑब्जेक्ट जो हर JSON कार्यान्वयन मैंने कभी देखा है के लिए एक NSDictionary पर नक्शे है। आप एक मनमाना स्ट्रिंग कार्रवाई करने के लिए चाहते हैं, आप क्या तुम वापस पाने के

NSError *jsonError; 
id parsedThing = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; 
if (parsedThing == nil) 
{ 
    // error 
} 
else if ([parsedThing isKindOfClass: [NSArray class]]) 
{ 
    // handle array, parsedThing can be cast as an NSArray safely 
} 
else 
{ 
    // handle dictionary, parsedThing can be cast as an NSDictionary 
    // NB only dictionaries and arrays allowed as long as NSJSONReadingAllowFragments 
    // not specified in the options 
} 
0

stringWithContentsOfFile:encoding: के लिए iOS 6+

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"contents" ofType:@"json"]; 
NSError * error=nil; 
NSString *jsonString = [NSString stringWithContentsOfFile:filePath encoding:nil error:&error]; 
NSData * jsonData = [jsonString dataUsingEncoding:nil]; 
NSArray * parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error]; 

contents.json फ़ाइल iOS<6

में पदावनत किया गया है अपने बंडल में है परीक्षण करने के लिए की आवश्यकता होगी ।

0

मैं गूगल भाषण मान्यता API का उपयोग किया है और मैं एक json प्रतिक्रिया जो सीधे iOS पर parsable नहीं था हो रही थी। परिणाम नमूने इस तरह थे:

सबसे पहले मैंने हैलो 1 2 3 कहने की कोशिश की जो मुद्दों के बिना पहचाना गया था। Json प्रतिक्रिया थी:

{"result":[]} 

{"result":[{"alternative":[{"transcript":"hello 123","confidence":0.59780568},{"transcript":"hello 1 2 3"}],"final":true}],"result_index":0} 

या जब भी लंबे समय के लिए बात की थी, मैं नीचे की तरह एक 404 एचटीएमएल मिला:

<html><title>Error 400 (Bad Request)!!1</title></html> 

और जब मैं निरर्थक शब्दों में बात की थी, मुझे मिल गया:

{"result":[]} 

तो इस तरह की सभी प्रतिक्रियाओं का विश्लेषण करने के लिए, मैंने नीचे दिए गए कोड का उपयोग किया:

NSString *msg = @"Could not synthesize !"; 

    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"responseString: %@",responseString); 
    if([responseString containsString:@"transcript"]&&responseString.length>25) 
    { 

     responseString = [responseString stringByReplacingOccurrencesOfString:@"{\"result\":[]}" withString:@""]; 

     NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:[responseString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil]; 

     if(dictionary!=nil) 
      if(dictionary.allValues.count>0) 
      { 

       NSArray *array =[dictionary valueForKeyPath:@"result.alternative.transcript"]; 

       if(array) 
       { 
        NSArray *array2 = [array objectAtIndex:0]; 
        if(array2) 
        { 
         NSLog(@"%@",[array2 objectAtIndex:0]); 
         msg = [array2 objectAtIndex:0]; 
        }; 
       } 
      } 
    } 

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Google Response" message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 

उम्मीद है कि यह किसी की मदद करता है।

+0

में उपलब्ध है आईओएस 8 से पहले, लाइन 'अगर ([प्रतिक्रिया स्ट्रिंग युक्त स्ट्रिंग: @ "ट्रांसक्रिप्ट"] और& प्रतिक्रियाString.length> 25) 'को निम्नलिखित में बदला जाना चाहिए: ' if ([respondString श्रेणीऑफस्ट्रिंग: @ "ट्रांसक्रिप्ट" विकल्प: एनएससीएएसइन्सेंसिव सर्च]। स्थान! = एनएसएनओटीफ़ाउंड और प्रतिक्रियास्ट्रिंग। लम्बाई> 25) ' –