Как получить доступ к различным ключам JSON в Swift 4.2 изначально? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть следующие фиктивные данные JSON для автобуса в школу.

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

Я хотел бы получить доступ к ключам "weekday" и "sat" с помощью переменной, основанной на вводе пользователем.Как я могу добиться этого изначально?

Используя SwiftyJSON, это довольно просто, как показано ниже

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

Однако мне было интересно, как это будет сделано изначально для удаления зависимостей.

Похоже, что CodingKey и enum могут быть способом справиться с этим.Когда пример так прост, как это , я могу понять.Тем не менее, я просто не могу разобраться с этим для моего конкретного использования, когда речь идет о пользовательских объектах, а не только о String.

Как я могу это сделать?Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 08 марта 2019

Я думаю, что код ниже будет работать:

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 
}

Чтобы декодировать ответ этого типа, вы должны декодировать этот JSON с типом SampleResponse.

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

После этого вы можете обращаться к переменным, как вы и просили.

1 голос
/ 08 марта 2019

Вы можете преобразовать строку JSON в словарь в swift и получить к ней доступ так же, как вы только что это сделали:

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]
1 голос
/ 08 марта 2019

Это основано на вашем предыдущем вопросе

func bus(isWeekday: Bool = true) -> [Bus] {
   return isWeekday ? shosfc.weekDay : shosfc.sat
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...