2015-11-09 6 views
6

मैं स्थानीय फ़ाइल से कुछ JSON डेटा लोड करने का प्रयास कर रहा हूं।JSON को संपत्ति के रूप में जोड़ना और इसे पढ़ना

this Apple doc में यह कहते हैं:

संपत्ति सूची का उपयोग कर अपने अनुप्रयोग के लिए डेटा फ़ाइलों को प्रबंधित करें। एक फ़ाइल एक्सकोड द्वारा उत्पन्न डिवाइस निष्पादन योग्य कोड को छोड़कर किसी भी प्रकार का डेटा हो सकती है। आप उन्हें JSON फ़ाइलें, स्क्रिप्ट, या कस्टम डेटा प्रकार के लिए उपयोग कर सकते हैं

तो मैं एक नया डेटा सेट जोड़ा गया है और अंदर JSON फ़ाइल गिरा दिया। अब मैं Assets.xcassets फ़ोल्डर के अंतर्गत इसे देख सकते हैं

मैंने पाया this ताकि जवाब देने से पता चलता है कि कैसे एक JSON फ़ाइल को पढ़ने के लिए है और मैं इस कोड का उपयोग कर रहा (Colours.dataset फ़ोल्डर colours.json और इसके अंदर Contents.json के साथ) फ़ाइल को पढ़ने के लिए:

if let filePath = NSBundle.mainBundle().pathForResource("Assets/Colours", ofType: "json"), data = NSData(contentsOfFile: filePath) { 

     print (filePath) 

     do { 
      let json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) 
      print(json) 
     } 
     catch { 

     } 
    } else { 
     print("Invalid file path") 
    } 

लेकिन इस कोड "अवैध फ़ाइल पथ" प्रिंट कर रहा है और नहीं फ़ाइल को पढ़ने। मैंने "रंग" और "रंग। जेसन" की भी कोशिश की लेकिन इसका कोई फायदा नहीं हुआ।

क्या कोई मुझे बता सकता है कि स्थानीय JSON फ़ाइल को सही ढंग से कैसे जोड़ना है और इसे पढ़ना है?

धन्यवाद।

उत्तर

11

आप डेटा संपत्ति फ़ाइलों तक पहुंच नहीं सकते हैं उसी तरह आप NSBundle.pathForResource का उपयोग करके यादृच्छिक फ़ाइल तक पहुंच सकते हैं। क्योंकि वे केवल Assets.xcassets भीतर परिभाषित किया जा सकता है, आप इसे की सामग्री का उपयोग करने के लिए एक NSDataAsset उदाहरण प्रारंभ करने की आवश्यकता:

let asset = NSDataAsset(name: "Colors", bundle: NSBundle.mainBundle()) 
let json = try? NSJSONSerialization.JSONObjectWithData(asset!.data, options: NSJSONReadingOptions.AllowFragments) 
print(json) 

कृपया ध्यान दें कि NSDataAsset वर्ग आईओएस 9.0 & MacOS 10.11 के रूप में पेश किया गया था।

Swift3 संस्करण:

let asset = NSDataAsset(name: "Colors", bundle: Bundle.main) 
let json = try? JSONSerialization.jsonObject(with: asset!.data, options: JSONSerialization.ReadingOptions.allowFragments) 
print(json) 

इसके अलावा, NSDataAsset आश्चर्यजनक रूप से UIKit/AppKit में स्थित है तो अपने कोड में प्रासंगिक ढांचे आयात करने के लिए मत भूलना:

#if os(iOS) 

    import UIKit 

#elseif os(OSX) 

    import AppKit 

#endif 
+0

एक आकर्षण की तरह काम किया, धन्यवाद –

0

ObjC

#ifdef use_json_in_bundle 
      NSString * path = [mb pathForResource:json_path ofType:@"json" inDirectory:@"JSON"]; 
      NSString * string = [NSString stringWithContentsOfUTF8File:path]; 
      NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding]; 
#else 
      NSDataAsset * asset = [[NSDataAsset alloc] initWithName:path]; 
      NSLog(@"asset.typeIdentifer = %@",asset.typeIdentifier); 
      NSData * data = [asset data]; 
#endif 
      NSError * booboo = nil; 
      id blob = [NSJSONSerialization JSONObjectWithData:data options:0 error:&booboo]; 

किसी भी शाखा के लिए, 'पथ' ju है जेएसएस फ़ाइल नाम सेंट करें।

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