2015-10-17 10 views
8

structを作成し、JSONファイルとして保存します。Swift:構造体をJSONに変換しますか?

になり
struct Sentence { 
    var sentence = "" 
    var lang = "" 
} 

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

...:

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

しかし、どのように私のような何かにstructオブジェクトを変換することができます

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

を可能な重複Swift](http://stackoverflow.com/questions/29625133/convert-dictionary-to-json-in-s) wift)(ヒントとして、配列や辞書をJSONに変換することしかできないので、基本的にJSON形式で入れたい値の辞書表現が必要です)。 – nhgrif

+0

本質的には、構造体をjsonのようなStringに変換できれば大丈夫です。配列と辞書だけがJSONに変換可能な場合、私の質問は:構造体を辞書に変換する方法ですか? – ixany

+0

https://github.com/Hearst-DD/ObjectMapperなどのサードパーティのライブラリがあります。しかし、私はそれについての経験はありません。 –

答えて

9

計算されたプロパティを追加してJSON表現を取得し、static(class)関数を使用してSentence配列からJSON配列を作成することができます。

+0

どうすればstructに変換できますか? –

+0

@BhavinRamani初期化子init(dict:[String:Any]){... 'を追加して値を抽出します – vadian

11

NSJSONSerialization classを使用してください。

これを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 
     } 
    } 

} 

をあなたの構造体のみがそれだけでJSON文字列を自分で構築する方が簡単かもしれない2つのプロパティを持っているので。

+0

正常に動作します。 –

+0

'toJSON()'の戻り値は 'NSData'でなければなりません。また、作成した 'props'辞書の2番目のキーは間違っています。 – nhgrif

+0

2番目のキーを文字列に更新しました。ありがとうございます。 2番目のポイントは、ユーザーが返すものに依存します – Scriptable

2
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"}] 

スイフト4は、例えば、エンコード可能なプロトコルをサポート

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

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

今、あなたは自動的にあなたの構造体がJSONEncoderを使用してJSONに変換することができます

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

はそれをプリントアウト:[JSONに辞書を変換するの

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

関連する問題