2009-07-02 14 views
26

में पार्स प्लास्ट (एनएसएसटींग) तो मेरे पास एक प्लास्ट संरचित स्ट्रिंग है, जो गतिशील रूप से प्राप्त होती है (फ़ाइल सिस्टम से नहीं)। मैं इस स्ट्रिंग को NSDictionary में कैसे बदलूं।एनएस डिक्शनरी

मैं इसे NSData परिवर्तित करने के लिए और फिर NSPropertyListSerialization के साथ एक NSDictionary करने की कोशिश की है, लेकिन यह रिटर्न "[NSCFString objectAtIndex:]: गैर मान्यता प्राप्त चयनकर्ता उदाहरण 0x100539f40 के लिए भेजा" जब मैं NSDictionary तक पहुँचने के लिए, दिखा रहा है कि मेरी शब्दकोश नहीं था प्रयास सफलतापूर्वक बनाया गया।

NSString (कि plist डेटा है) का उदाहरण:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
<key>Key1</key> 
<dict> 
    <key>Test1</key> 
    <false/> 
    <key>Key2</key> 
    <string>Value2</string> 
    <key>Key3</key> 
    <string>value3</string> 
</dict> 
</dict> 
</plist> 

धन्यवाद!

उत्तर

72

देखें Serializing a Property List

NSData* plistData = [source dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *error; 
NSPropertyListFormat format; 
NSDictionary* plist = [NSPropertyListSerialization propertyListWithData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error]; 
NSLog(@"plist is %@", plist); 
if(!plist){ 
    NSLog(@"Error: %@",error); 
    [error release]; 
} 
+4

+1 आपका समाधान अच्छी तरह से पॉलिश लगता है - एनएस डिक्शनरी बनाने के लिए अपरिवर्तनीय उपयोग करके और यदि कोई बोनस पॉइंट्स के लायक है तो त्रुटि को रिलीज़ करना याद रखें। :-) –

+0

मैंने लगभग इसे ओवर-रिलीज़ कहा। उम, वाह। वह एपीआई कॉलर को उस त्रुटि स्ट्रिंग को रिलीज़ करने के लिए मेमोरी प्रबंधन नियमों का पूरी तरह से उल्लंघन करता है। –

+0

रिलीज नोट्स के अनुसार, यह तेंदुए में उल्लंघन नहीं हुआ है। के लिए बाहर देखो। इसके बारे में एक बग रिपोर्ट है: http://openradar.appspot.com/5563963 –

12

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

NSData * data = [yourString dataUsingEncoding:NSUTF8StringEncoding]; 

NSString *errorDesc = nil; 
NSPropertyListFormat format; 
NSDictionary * dict = (NSDictionary*)[NSPropertyListSerialization 
             propertyListFromData:data 
             mutabilityOption:NSPropertyListMutableContainersAndLeaves 
             format:&format 
             errorDescription:&errorDesc]; 
+0

बिल्कुल सही! धन्यवाद! – christo16

+0

मेमोरी रिसाव के अलावा, लेकिन यह होता है (: – Jacob

+0

NSDictionary * dict = (NSDictionary *) [NSPropertyListSerialization ...... आपको उस फ़ाइल को जांचने की आवश्यकता है जिसे आप पढ़ने की कोशिश कर रहे हैं क्योंकि आप एक एनएसएआरएआरई लौट रहे हैं NSDictionary। – Komposr

1

I've tried converting it NSData and then to a NSDictionary with NSPropertyListSerialization, but it returns "[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x100539f40" when I attempt to access the NSDictionary, showing that my Dictionary was not successfully created.

नहीं, यह ऐसी कोई बात नहीं चलता। यह दिखाता है कि आपने स्ट्रिंग को सरणी के रूप में इलाज करने का प्रयास किया है। आपको यह निर्धारित करने की आवश्यकता होगी कि आप जिस सरणी को सरणी प्राप्त करने का प्रयास कर रहे थे, वहां एक स्ट्रिंग क्यों थी जहां आपने एक सरणी की अपेक्षा की थी- यानी, क्या आपने गलती से गलती बनाई है ( उसमें एक स्ट्रिंग डालना जहां आप रखना चाहते थे एक सरणी) या गलत तरीके से इसकी जांच कर रहे हैं (एक स्ट्रिंग की उपस्थिति सही है; आपकी सरणी की अगली उम्मीद गलत है)।

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