无密钥容器的JSON数组(快速解析) [英] JSON array of unkeyed containers (to parse in swift)
问题描述
我该如何解析?数组未命名,对象未命名?如果你们也有任何建议,我还需要对事件进行排序并找出事件之间的重叠,这对我也将有很大帮助.
How do I parse this? The array is unnamed, the objects are unnamed? I also need to sort it and find overlaps between events IF you guys have any advice there too it will be a huge help for me.
[{"title": "Evening Picnic", "start": "November 10, 2018 6:00 PM", "end": "November 10, 2018 7:00 PM"},
{"title": "Nap Break", "start": "November 8, 2018 12:56 PM", "end": "November 8, 2018 1:30 PM"},
{"title": "Football Game", "start": "November 3, 2018 6:14 PM", "end": "November 3, 2018 9:44 PM"}]
我是新手,我想知道如何处理
I'm new to swift and I'm wondering how to deal with this
推荐答案
Your JSON doesn't required you to implement an unkeyed container to parse it unkeyed container sample. What you need is a custom DateFormatter
and DateDecodingStrategy
. To sort your events you would need to conform it to Comparable
protocol
此 DateFormatter
假定您的日期字符串是具有本地时间的固定日期格式:
This DateFormatter
assumes your date string is a fixed date format with a local time:
extension Formatter {
static let custom: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "MMMM d, yyyy h:mm a"
return formatter
}()
}
自定义 DateDecodingStrategy
:
extension JSONDecoder.DateDecodingStrategy {
static let monthDayYearTime = custom {
let container = try $0.singleValueContainer()
let string = try container.decode(String.self)
guard let date = Formatter.custom.date(from: string) else {
throw DecodingError.dataCorruptedError(in: container,
debugDescription: "Invalid date: " + string)
}
return date
}
}
您的 Codable
事件结构:
struct Event: Codable {
let title: String
let start: Date
let end: Date
}
使其符合可比较
协议
extension Event: Comparable {
static func < (lhs: Event, rhs: Event) -> Bool { lhs.start < rhs.start }
}
自定义说明
:
extension Event: CustomStringConvertible {
var description: String {
"Title: \(title) - Start: \(Formatter.custom.string(from: start)) - End: \(Formatter.custom.string(from: end))"
}
}
游乐场测试:
Playground testing:
您的JSON字符串:
let json = """
[{"title": "Evening Picnic", "start": "November 10, 2018 6:00 PM", "end": "November 10, 2018 7:00 PM"},
{"title": "Nap Break", "start": "November 8, 2018 12:56 PM", "end": "November 8, 2018 1:30 PM"},
{"title": "Football Game", "start": "November 3, 2018 6:14 PM", "end": "November 3, 2018 9:44 PM"}]
"""
解码JSON
Decoding your JSON
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .monthDayYearTime
do {
let events = try decoder.decode([Event].self, from: Data(json.utf8))
print(events.sorted())
} catch {
print(error)
}
这将打印
[标题:足球比赛-开始:2018年11月3日下午6:14-结束:2018年11月3日,下午9:44,标题:午睡-开始:2018年11月8日12:56 PM-结束时间:2018年11月8日1:30 PM,标题:Evening Picnic-开始:2018年11月10日下午6:00-结束:2018年11月10日下午7:00]
[Title: Football Game - Start: November 3, 2018 6:14 PM - End: November 3, 2018 9:44 PM, Title: Nap Break - Start: November 8, 2018 12:56 PM - End: November 8, 2018 1:30 PM, Title: Evening Picnic - Start: November 10, 2018 6:00 PM - End: November 10, 2018 7:00 PM]
这篇关于无密钥容器的JSON数组(快速解析)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!