2017-10-05 112 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