2017-10-05 33 views
0

私はField構造体の配列をJSON文字列に変換したいと考えています。Swift 3 - 構造体を含む構造体の配列をJSONに変換する方法は?

Fieldは次のように定義されています

struct Field{ 

    var name: String 
    var center: LatLng 
    var perimeter: [LatLng] 

    func toDictionary() -> [String : Any]{ 
     let dict: [String : Any] = ["name":self.name, 
            "center":self.center.toDictionary(), 
            "perimeter": ppsToDictArray()] 
     return dict 
    } 

    fileprivate func ppsToDictArray() -> [Any]{ 
     var data = [Any]() 
     for pp in perimeterPoints{ 
      data.append(pp.toDictionary()) 
     } 
     return data 
    } 


} 

LatLngは以下のように定義されています

struct LatLng{ 

    let latitude: Double 
    let longitude: Double 

    func toDictionary() -> [String : Any]{ 
     let dict: [String : Any] = ["latitude": self.latitude, 
            "longitude": self.longitude] 
     return dict 
    } 

} 

私はJSONに私の配列を変換しようとしているのはここです:

//selectedFields is a [Field] populated with some Fields 
    let dicArray = selectedFields.map{$0.toDictionary()} 
    if let data = try? JSONSerialization.data(withJSONObject: dicArray, options: .prettyPrinted){ 
     let str = String(bytes: data, encoding: .utf8) 
     print(str) //Prints a string of "\n\n" 
    } 

方法私はそのような配列をJSON文字列に変換できますか?私はthis answerの行に沿って何かを試みましたが、それはOptional("[\n\n]")"として印刷されます(印刷時に「オプション」と表示される理由を理解しています)。私はstructs-within-structsの状況のた​​めに外挿した後に動作するようには思えません。私はスウィフトにも約1ヶ月しかいません。

EDIT: 私は上記のコードを編集して、より多くの作業を見たいという要求に応えて、私が取り組んでいた作業のより完全な例を示しました。元のコードを修正する方法を尋ねるのではなく、ネストされた構造体を使用してプロセスを実行する方法の例については、もともとはすべてを含めなかった。

+0

あなたの作品を見てみましょう。 –

+0

あなたは何をしようとしているより多くのコードを投稿しようとしていますか?そして、あなたに出力 'Optional(" [\ n \ n] ")'を与えるものは何ですか? –

+0

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

答えて

0
struct LatLng { 
    let latitude: Double 
    let longitude: Double 

    func getJSON() -> NSMutableDictionary { 
     let dict = NSMutableDictionary() 
     dict.setValue(latitude, forKey: "latitude") 
     dict.setValue(longitude, forKey: "longitude") 
     return dict 
    } 
} 

struct Field { 
    var name: String 
    var center: LatLng 
    var perimeter: [LatLng] 

    func getJSON() -> NSMutableDictionary { 
     let values = NSMutableDictionary() 

     var perimeterArray = Array<NSMutableDictionary>() 
     for item in perimeter { 
      perimeterArray.append(item.getJSON()) 
     } 

     values.setValue(name, forKey: "name") 
     values.setValue(center.getJSON(), forKey: "center") 
     values.setValue(perimeterArray, forKey: "perimeter") 

     return values 

    } 
} 

let peri = [LatLng(latitude: 10.0, longitude: 10.0), LatLng(latitude: 20.0, longitude: 20.0)] 
let center = LatLng(latitude: 15.0, longitude: 15.0) 

let field = Field(name: "test", center: center, perimeter: peri) 

let json = try NSJSONSerialization.dataWithJSONObject(field.getJSON(), options: .PrettyPrinted) 
let jsonString = NSString(data: json, encoding: NSUTF8StringEncoding) 
print(jsonString) 

//PRINTS THE FOLLOWING OUTPUT 
Optional({ 
    "name" : "test", 
    "center" : { 
     "longitude" : 15, 
     "latitude" : 15 
    }, 
    "perimeter" : [{ 
     "longitude" : 10, 
     "latitude" : 10 
    }, 
    { 
     "longitude" : 20, 
     "latitude" : 20 
    }] 
}) 

UPDATE

Fieldオブジェクトの配列をシリアル化するために、あなたはこのような何かを行うことができます。

let field1 = Field(name: "value1", center: center, perimeter: peri) 
let field2 = Field(name: "value2", center: center, perimeter: peri) 
let field3 = Field(name: "value3", center: center, perimeter: peri) 

let fieldArray = [field1.getJSON(), field2.getJSON(), field3.getJSON()] 

let json = try NSJSONSerialization.dataWithJSONObject(fieldArray, options: .PrettyPrinted) 
let jsonString = NSString(data: json, encoding: NSUTF8StringEncoding) 

これは簡単な解決策であり、最適な解決策ではありません。これはちょうどそれが行く方法のアイデアを与えることです。あなたはそれを改善することができると確信しています。

+0

ありがとう!非常に良いと簡潔なソリューション。これは私が見つけることができなかった情報です( "スウィフト3 json構造体の構造体の配列を変換する"それを切断していなかった、私は関連用語を知りませんでした)。 – Xenalin

+0

フィールドオブジェクトの配列全体をシリアル化することをどのように提案しますか?それは私の質問から私が知る必要がある最後のことです。 – Xenalin

+0

私にそれを更新していただきありがとうございます!ええ、スウィフトでJSONをどのように処理するかについては、たくさんのことを読んでいます。時間の経過とともに急速に変化するようです。私はちょうど私がGsonを使用することができたAndroidから来た。便利な人... – Xenalin

関連する問題