Swift - Использование Decodable для декодирования массива JSON только строк - PullRequest
0 голосов
/ 02 марта 2019

У меня есть пример JSON, где он представляет собой просто массив строк и не имеет ключей, и я хотел бы использовать протокол Decodable для использования JSON и создания из него простой модели.

JSONвыглядит так:

{ "names": [ "Bob", "Alice", "Sarah"] }

Просто набор строк в простом массиве.

В чем я не уверен, так это как мне использовать новый протокол Swift Decodable для чтения этогов модель без ключа.

Большинство примеров, которые я видел, предполагают, что JSON имеет ключ.

IE:

// code from: Medium article: https://medium.com/@nimjea/json-parsing-in-swift-2498099b78f

struct User: Codable{
       var userId: Int
       var id: Int
       var title: String
       var completed: Bool
}

do {
    //here dataResponse received from a network request
    let decoder = JSONDecoder()
    let model = try decoder.decode([User].self, from:
                 dataResponse) //Decode JSON Response Data 
    print(model)
} catch let parsingError {
    print("Error", parsingError)
}

В этом примере выше предполагается, чтоJSON является ключевым значением;Как я могу использовать декодируемый протокол для расшифровки JSON без ключей?

С благодарностью

Ответы [ 2 ]

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

Для этой простой структуры json, я думаю, что лучше не создавать никаких структур и использовать

let model = try decoder.decode([String:[String]].self, from: dataResponse)
print(model["names"])

json подходит для вашей модели

{

    "names": [{ 
          "userId": 2,
         "id": 23,
         "title": "gdgg",
         "completed": true

    }]
}


struct Root: Codable {
    let names: [User]
}

struct User: Codable {
    let userId, id: Int
    let title: String
    let completed: Bool

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

Соответствующей структурой этого JSON является

struct User: Decodable {
   let names: [String]
}

и декодирование

let model = try decoder.decode(User.self, from: dataResponse)

и получение имен с

let names = model.names

или традиционно без накладных расходовJSONDecoder

let model = try JSONSerialization.jsonObject(with: dataResponse) as? [String:[String]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...