2017-10-05 113 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]")"(我明白爲什麼打印時顯示「可選」)。在推斷我的結構內部結構情況後,我似乎無法完成它的工作。我也只有大約一個月進入Swift。

編輯: 我編輯了上面的代碼,以表示一個更完整的例子,說明了我正在處理的一個響應請求以查看更多工作的內容。我原來並沒有包含所有這些,因爲我並沒有問如何解決現有的代碼,而更多的是關於如何使用嵌套的結構來處理這個過程的例子。

+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

謝謝!非常好,簡潔的解決方案。這是我找不到的信息(谷歌搜索「結構內的結構」的Swift 3 json轉換數組並沒有削減它,我不知道相關條款)。 – Xenalin

+0

你會如何建議我序列化整個Field對象數組?這是我需要從我的問題中知道的最後一件事。 – Xenalin

+0

感謝您爲我更新!是的,我讀了很多關於人們如何用Swift處理JSON的東西。它似乎隨着時間的推移而迅速變化。我剛剛從Android中獲得了Gson的使用權。這是一個方便的人... – Xenalin