Столкнувшись с проблемой синтаксического анализа JSON в Swift - PullRequest
0 голосов
/ 05 мая 2019

Мой REST возвращает после массива и только один элемент.

{
"Table1": [
    {
        "Id": 1,
        "ClauseNo": "2-111",
        "Title": "Testing Title",
        "URL": "http://www.google.com",
    }
]
}

Я пытаюсь использовать Codable следующим образом:

struct Clause: Codable {
 var Id: Int
 var ClauseNo: String
 var Title: String
 var URL: String
}

Что я делаю неправильноследующий код?

 func parse(json: Data) -> Clause {
 var clause: Clause?

 if let jsonClause = try? JSONDecoder().decode([Clause].self, from:   json) {

   clause = jsonClause
 }

 return clause!
}

Как я упоминал выше, у меня есть только 1 предмет, не более того.

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Это очень распространенная ошибка, вы игнорируете корневой объект

struct Root : Decodable {   
    private enum CodingKeys : String, CodingKey { case table1 = "Table1" }

    let table1 : [Clause]
}

struct Clause: Decodable {

    private enum CodingKeys : String, CodingKey { case id = "Id", clauseNo = "ClauseNo", title = "Title", url = "URL" }

    let id: Int
    let clauseNo: String
    let title: String
    let url: URL
}

...

func parse(json: Data) -> Clause? {
    do {
        let result = try JSONDecoder().decode(Root.self, from: json)
        return result.table1.first
    } catch { print(error) }
    return nil
}

Примечание: Ваш код надежно падает при возникновении ошибки

0 голосов
/ 05 мая 2019

Я склонен обращаться со следующими сценариями:

struct Table1 : Codable {
    var clauses: [Clause]

    struct Clause: Codable {
        let Id: Int            // variable names should start with a lowercase
        let ClauseNo: String   // letter  :)
        let Title: String
        let URL: String
    }
}

А потом, когда вы декодируете, вы получаете таблицу, из которой вы хотите получить первый элемент, что-то вроде:

if let jsonTable = try? JSONDecoder().decode(Table1.self, from: json) {
   clause = jsonTable.clauses[0]
}
...