在Swift中处理json中不同类型的元组

时间:2017-10-10 01:34:52

标签: json swift date tuples

我想保存一个元组数组,其中一个元素是值,另一个元素是Swift 3中的Date。

这是一些硬编码的例子。

var currentDateTime = NSDate()

var confArray: [(conf: Int, date: NSDate)] = []

confArray.append((4, currentDateTime.addingTimeInterval(60 * 60 * 24 * -15)))
confArray.append((3, currentDateTime.addingTimeInterval(60 * 60 * 24 * -7)))
confArray.append((3, currentDateTime))
confArray.append((1, currentDateTime.addingTimeInterval(60 * 60 * 24 * 1)))
confArray.append((5, currentDateTime.addingTimeInterval(60 * 60 * 24 * 2)))
confArray.append((3, currentDateTime.addingTimeInterval(60 * 60 * 24 * 3)))

然而,看起来JSON不允许使用元组,并且当我做这样的事情时会抛出错误。

let trackingContent = ["key": confArray ]
let jsonData = try JSONSerialization.data(withJSONObject: trackingContent, options: JSONSerialization.WritingOptions())

有解决方法吗?

我已经考虑过将这两个元素转换为String并将它们保存为字符串数组。但是,将Date转换为String需要多行,我必须将其转换回来。 如果有更有效的方法来存储JSON中的元组或者我错过了什么,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:2)

让我们一起玩!

import Foundation

typealias Conf = (idx: Int, interval: TimeInterval)
typealias JSConf = [String]

extension Array where Element == Conf {
    func encode() -> JSConf {
        return map { "\($0.idx):\($0.interval)" }
    }

    static func decode(_ jsConf: JSConf) -> [Conf] {
        return jsConf.map({ e -> Conf in
            let comps = e.components(separatedBy: ":")
            return (Int(comps.first!)!, Double(comps.last!)!)
        })
    }
}

var confs: [Conf] = []
confs.append((4, 60 * 60 * 24 * -15))
confs.append((3, 60 * 60 * 24 * -7))
confs.append((3, 0))
confs.append((1, 60 * 60 * 24 * 1))
confs.append((5, 60 * 60 * 24 * 2))
confs.append((3, 60 * 60 * 24 * 3))

let encode = confs.encode()

let data = ["key": encode]
do {
    let _ = try JSONSerialization.data(withJSONObject: data, options: JSONSerialization.WritingOptions())
} catch {
    print(error.localizedDescription)
}

let decode = [Conf].decode(encode)

print(decode)

希望这有帮助!