Использование Swift, декодируемого на вложенных массивах строк - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь декодировать массив строк, где в возвращаемом JSON есть массив строк, но он также содержит вложенные массивы

IE: JSON:

{ "people": ["Alice", "Bob"], 
"departments": [["Accounts", "Sales"]]
}

Swift:

let decoder = JSONDecoder()
let model = try decoder.decode([String:[String]].self, from: dataResponse)
print(model as Any)

Я хочу иметь возможность декодировать отделы, но каждый раз, когда я делаю это, он жалуется, что:

Ошибка typeMismatch (Swift.String, Swift.DecodingError.Context (codingPath::

Я понимаю, что это потому, что декодер ожидает строку с массивом строк

Мне интересно, могу ли я также сказать, что он должен ожидать несколько вложенных массивов строк.

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Если вы не хотите создавать структуры (например, нужен только фрагмент данных), вот подход, который следует рассмотреть.

let jsonData =  """
{ "people": ["Alice", "Bob"],
"departments": [["Accounts", "Sales"]],
"stores": [["Atlanta", "Denver"]]
}
""".data(using: .utf8)

if let jsonObject = try? JSONSerialization.jsonObject(with: jsonData!, options: []) as? [String: Any] {
    if let people = jsonObject?["people"] as? [String] {
        print(people)
    }
    if let departments = jsonObject?["departments"] as? [[String]] {
        print(departments)
    }
}
0 голосов
/ 03 марта 2019

Вам просто нужно создать соответствующую структуру и передать ее декодеру:

struct Root: Decodable {
    let people: [String]
    let departments: [[String]]
}

let decoder = JSONDecoder()
do {
    let model = try decoder.decode(Root.self, from: dataResponse)
     print(model.people)      // ["Alice", "Bob"]\n"
     print(model.departments) // [["Accounts", "Sales"]]\n"
} catch {
    print(error) 
}
...