Swift 3 - 如何将包含结构的结构数组转换为JSON?

时间:2017-10-05 03:47:25

标签: json swift

我有一个$t = '05/10/2017 18:00'; $c = Carbon::parse(str_replace('/', '-', $t)); 结构数组,我想将其转换为JSON字符串。

Field定义为:

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

这是我尝试将我的数组转换为JSON的地方:

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字符串?我尝试了this answer的某些内容,但它打印为 //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" } (我理解为什么打印时会说“可选”)。在推断出我的结构内部情况之后,我似乎无法让它工作。我也只有一个月的时间进入斯威夫特。

编辑: 我编辑了上面的代码,以代表一个更完整的例子,说明我在回应查看更多工作的请求时所做的工作。我最初没有包括所有内容,因为我没有询问如何修复现有代码,而是更多关于如何使用嵌套结构进行处理的示例。

1 个答案:

答案 0 :(得分: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
    }]
})

<强>更新

为了序列化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)

请注意,这只是一个快速解决方案,而不是最好的解决方案。这只是为了让您了解它将如何发展。我相信你能够改进它。