无密钥容器的JSON数组(快速解析) [英] JSON array of unkeyed containers (to parse in swift)

查看:67
本文介绍了无密钥容器的JSON数组(快速解析)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我该如何解析?数组未命名,对象未命名?如果你们也有任何建议,我还需要对事件进行排序并找出事件之间的重叠,这对我也将有很大帮助.

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

推荐答案

您的JSON不需要您实现未加密的容器来解析它

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆