2015-10-17 9 views
8

मैंने struct बनाया और इसे JSON-फ़ाइल के रूप में सहेजना चाहते हैं।स्विफ्ट: जेएसओएन में संरचना कनवर्ट करें?

struct Sentence { 
    var sentence = "" 
    var lang = "" 
} 

var s = Sentence() 
s.sentence = "Hello world" 
s.lang = "en" 
print(s) 

... जिसमें परिणाम:

{ 
    "sentence": "Hello world", 
    "lang": "en" 
} 
+1

JSON के शब्दकोश में कनवर्ट की [संभावित डुप्लिकेट स्विफ्ट में] (http://stackoverflow.com/questions/29625133/convert-dictionary-to-json-in-s wift) (एक संकेत के रूप में, आप केवल एक सरणी या शब्दकोश को JSON में परिवर्तित कर सकते हैं, इसलिए मूल रूप से आपको उस मान का एक शब्दकोश प्रस्तुत करने की आवश्यकता है जिसे आप JSON प्रारूप में रखना चाहते हैं)। – nhgrif

+0

अनिवार्य रूप से, यह बहुत अच्छा होगा अगर मैं संरचना को जेसन जैसी स्ट्रिंग में परिवर्तित कर सकता हूं। जब केवल सरणी और शब्दकोश JSON में कनवर्ट करने योग्य होते हैं, तो मेरा प्रश्न है: संरचना को एक शब्दकोश में कैसे परिवर्तित करें? – ixany

+0

तृतीय पक्ष पुस्तकालय हैं जैसे https://github.com/Hearst-DD/ObjectMapper। हालांकि, मुझे इसके साथ कोई अनुभव नहीं है। –

उत्तर

9

आप Sentence सरणी से JSON सरणी बनाने के लिए JSON प्रतिनिधित्व और स्थिर (वर्ग) फ़ंक्शन प्राप्त करने के लिए एक गणना की गई संपत्ति जोड़ सकते हैं।

struct Sentence { 
    var sentence = "" 
    var lang = "" 

    static func jsonArray(array : [Sentence]) -> String 
    { 
    return "[" + array.map {$0.jsonRepresentation}.joinWithSeparator(",") + "]" 
    } 

    var jsonRepresentation : String { 
    return "{\"sentence\":\"\(sentence)\",\"lang\":\"\(lang)\"}" 
    } 
} 


let sentences = [Sentence(sentence: "Hello world", lang: "en"), Sentence(sentence: "Hallo Welt", lang: "de")] 
let jsonArray = Sentence.jsonArray(sentences) 
print(jsonArray) // [{"sentence":"Hello world","lang":"en"},{"sentence":"Hallo Welt","lang":"de"}] 
+0

लौटने की इच्छा रखता है हम इसे संरचना में कैसे बदल सकते हैं? –

+0

@ भविनरामनी एक प्रारंभिक योजक जोड़ें (dict: [स्ट्रिंग: कोई भी]) {... 'और मूल्य निकालें – vadian

11

उपयोग NSJSONSerialization class:

Sentence(sentence: "Hello world", lang: "en") 

लेकिन यह कैसे मैं की तरह कुछ करने के लिए struct वस्तु में बदल सकते हैं।

reference के लिए इसका उपयोग करके, आपको एक फ़ंक्शन बनाने की आवश्यकता हो सकती है जो JSON क्रमबद्ध स्ट्रिंग देता है। इस फ़ंक्शन में आप आवश्यक गुण ले सकते हैं और उनमें से NSDictionary बना सकते हैं और ऊपर वर्णित कक्षा का उपयोग कर सकते हैं।

कुछ इस तरह:

struct Sentence { 
    var sentence = "" 
    var lang = "" 

    func toJSON() -> String? { 
     let props = ["Sentence": self.sentence, "lang": lang] 
     do { 
      let jsonData = try NSJSONSerialization.dataWithJSONObject(props, 
      options: .PrettyPrinted) 
      return String(data: jsonData, encoding: NSUTF8StringEncoding) 
     } catch let error { 
      print("error converting to json: \(error)") 
      return nil 
     } 
    } 

} 

क्योंकि आपके struct केवल दो गुण है कि यह सिर्फ JSON स्ट्रिंग खुद के निर्माण करने के लिए आसान हो सकता है।

+0

यह ठीक काम करता है। –

+0

'toJSON()' की वापसी 'NSData' होनी चाहिए। साथ ही, आपके द्वारा बनाए गए 'प्रोप' शब्दकोश में दूसरी कुंजी गलत है। – nhgrif

+0

मैंने स्ट्रिंग होने के लिए दूसरी कुंजी अपडेट की है, धन्यवाद। दूसरा बिंदु इस बात पर निर्भर करता है कि उपयोगकर्ता – Scriptable

2

स्विफ्ट 4 जैसे Encodable प्रोटोकॉल का समर्थन करता

struct Sentence: Encodable { 
    var sentence: String? 
    var lang: String? 
} 

let sentence = Sentence(sentence: "Hello world", lang: "en") 

अब आप स्वत: JSON में अपने Struct परिवर्तित एक JSONEncoder का उपयोग कर सकते हैं:

let jsonEncoder = JSONEncoder() 
let jsonData = try jsonEncoder.encode(sentence) 

यह प्रिंट आउट:

let jsonString = String(data: jsonData, encoding: .utf8) 
print(jsonString) 

{ 
    "sentence": "Hello world", 
    "lang": "en" 
} 

https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types

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