在Swift中处理json中不同类型的元组
我想保存一个元组数组,其中一个元素是值,另一个元素是Swift 3中的日期 下面是一些硬编码的示例在Swift中处理json中不同类型的元组,json,swift,date,tuples,Json,Swift,Date,Tuples,我想保存一个元组数组,其中一个元素是值,另一个元素是Swift 3中的日期 下面是一些硬编码的示例 var currentDateTime = NSDate() var confArray: [(conf: Int, date: NSDate)] = [] confArray.append((4, currentDateTime.addingTimeInterval(60 * 60 * 24 * -15))) confArray.append((3, currentDateTime.addi
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())
有办法解决这个问题吗
我考虑过将这两个元素转换成字符串,并将它们保存为字符串数组。然而,将日期转换为字符串需要多行,我必须将其转换回。
请告诉我是否有更有效的方法在JSON中存储元组,或者我是否遗漏了什么。谢谢 我们来玩吧
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)
希望这有帮助 我们来玩吧
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)
希望这有帮助 为什么要使用数组类型?我的建议是将
confArray
转换为[Int:[NSDate]]
您也可以使用时间戳(timeintervalnce1970)而不是NSDate。它可以很容易地转换回Date@DaoNguyenint值不是唯一的,因此必须是[NSDate:int]
或[[int:NSDate]]]
。在第二种情况下,是否可能在不知道值的情况下获取日期?我需要订购confArray,以便访问第3个元素中的日期、第5个元素中的值等@Woof谢谢!使用时间间隔是有意义的。我正在考虑使用Date而不是NSDate,但是如果我必须在字符串和NSDate之间切换,NSDate似乎更好。@DaoNguyen在使用JSON时不能使用Int作为字典键,因为它必须是字符串。为什么要使用数组类型?我的建议是将confArray
转换为[Int:[NSDate]]
您也可以使用时间戳(timeintervalnce1970)而不是NSDate。它可以很容易地转换回Date@DaoNguyenint值不是唯一的,因此必须是[NSDate:int]
或[[int:NSDate]]]
。在第二种情况下,是否可能在不知道值的情况下获取日期?我需要订购confArray,以便访问第3个元素中的日期、第5个元素中的值等@Woof谢谢!使用时间间隔是有意义的。我在考虑使用Date而不是NSDate,但是如果我必须在字符串和NSDate之间切换,NSDate似乎更好。@DaoNguyen在使用JSON时不能使用Int作为字典键,它必须是字符串。哇,谢谢!我将从现在开始把时间间隔改为1970年的时间间隔,我想这正是我想要的!哇,谢谢!我将从现在开始把时间间隔改为1970年的时间间隔,我想这正是我想要的!