如何本地访问Swift 4.2中的各种JSON密钥?

时间:2019-03-08 08:57:06

标签: json swift

我有以下虚拟的JSON数据,用于上学的公共汽车。

{
    "toSchool": {
        "weekday": [{
            "hour": 7,
            "min": 10,
            "type": null,
            "rotary": false
        }],
        "sat": [{
            "hour": 8,
            "min": 15,
            "type": null,
            "rotary": true
        }]
    }
}

我想使用基于用户输入的变量来访问“工作日”和“星期六”键。我如何才能做到这一点?

使用SwiftyJSON,这非常简单,如下所示

let json = try JSON(data: data)
let userDirection = "shosfc"
let userWeek = "weekday"
let busList = json[userDirection][0][userWeek]

但是,我想知道如何在本地删除依赖项。

看来CodingKeyenum可能是处理此问题的方法。当示例像this一样简单时,我可以理解。但是,我只是无法针对我的特殊用途来解决它,因为它涉及自定义对象而不仅仅是String。

我该怎么做?请帮忙。

3 个答案:

答案 0 :(得分:1)

这是基于您的earlier question

func bus(isWeekday: Bool = true) -> [Bus] {
   return isWeekday ? shosfc.weekDay : shosfc.sat
}

答案 1 :(得分:1)

我认为下面的代码会起作用:

struct SampleResponse: Codable {
    let toSchool: ToSchool 
}

struct ToSchool: Codable {
    let weekday, sat: [Sat] 
}

struct Sat: Codable {
    let hour, min: Int
    let type: String?
    let rotary: Bool 
}

要解码这种类型的响应,必须使用SampleResponse类型对此JSON进行解码。

let sampleResponse = try? newJSONDecoder().decode(SampleResponse.self, from: jsonData)

在那之后,您可以按照要求访问变量。

答案 2 :(得分:1)

您可以快速将JSON字符串转换为Dictionary并以与以前相同的方式访问它:

func parseToDictionary(_ jsonStr: String) -> [String: Any]? {
    if let data = jsonStr.data(using: .utf8) {
        do {
            return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
        } catch {
            print(error.localizedDescription)
        }
    }
    return nil
}

let jsonStr = "{Your JSON String}"

let json = parseToDictionary(jsonStr)
let userDirection = "shosfc"
let userWeek = "weekday"
let busList = json[userDirection][0][userWeek]