JSON Parsing Swift 4 - PullRequest
       9

JSON Parsing Swift 4

0 голосов
/ 28 мая 2018

Я пытался проанализировать некоторые данные JSON, но у меня возникли проблемы.Вот JSON:

    {
  "result": {
    "artist": {
      "name": "The Beatles"
    },
    "track": {
      "name": "Yesterday",
      "text": "[Verse 1]\nYesterday\nAll my troubles seemed so far away\nNow it looks as though they're here to stay\nOh, I believe in yesterday\n\n[Verse 2]\nSuddenly\nI'm not half the man I used to be\nThere's a shadow hanging over me\nOh, yesterday came suddenly\n\n[Chorus]\nWhy she had to go\nI don't know, she wouldn't say\nI said something wrong\nNow I long for yesterday\n\n[Verse 3]\nYesterday\nLove was such an easy game to play\nNow I need a place to hide away\nOh, I believe in yesterday\n\n[Chorus]\nWhy she had to go\nI don't know, she wouldn't say\nI said something wrong\nNow I long for yesterday\n\n[Verse 4]\nYesterday\nLove was such an easy game to play\nNow I need a place to hide away\nOh, I believe in yesterday",
      "lang": {
        "code": "en",
        "name": "English"
      }
    },
    "copyright": {
      "notice": "Yesterday lyrics are property and copyright of their owners. Commercial use is not allowed.",
      "artist": "Copyright The Beatles",
      "text": "All lyrics provided for educational purposes and personal use only."
    },
    "probability": "75.00",
    "similarity": 1
  }
} 

А вот мой код:

        guard let url = URL(string: "https://orion.apiseeds.com/api/music/lyric/Beatles\Yesterday?apikey=xxx") else { return }

        URLSession.shared.dataTask(with: url) { (data, response, error) in

            if error != nil {

                print(error!)
            }

            guard let data = data else { return }
            do {

                let data = try JSONDecoder().decode(Result.self, from: data)
                print(data)
            } catch let jsonError {

                print(jsonError)
            }
        }.resume()

struct Result: Codable {

    let artist: [Artist]
}

struct Artist: Codable {

    let name: String
}

Ошибка, которую я получаю при попытке запустить:

keyNotFound (CodingKeys (stringValue: "artist", intValue: nil), Swift.DecodingError.Context (codingPath: [], debugDescription: "Нет значения, связанного с ключом CodingKeys (stringValue: \" artist \ ", intValue: nil) (\ "artist \"). ", underError: nil))

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

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Создайте правильную структуру для вашей модели, если что-то идет с нулем, сделайте его необязательным, в противном случае произойдет сбой, для преобразования JSON в Объекты вы можете использовать этот онлайн-инструмент длябудущее, вполне полезно !https://app.quicktype.io/

struct AudioSearch: Codable {
    let result: Result
}

struct Result: Codable {
    let artist: Artist
    let track: Track
    let copyright: Copyright
    let probability: String
    let similarity: Int
}

struct Artist: Codable {
    let name: String
}

struct Copyright: Codable {
    let notice, artist, text: String
}

struct Track: Codable {
    let name, text: String
    let lang: Lang
}

struct Lang: Codable {
    let code, name: String
}

И используйте декодирование так:

let result = try JSONDecoder().decode(AudioSearch.self, from: data)
0 голосов
/ 28 мая 2018

Вы должны создать структуру, подобную приведенной ниже, для своего JSON,

struct ResultResponse: Codable {
    let result: Result
}

struct Result: Codable {
    let artist: Artist
    let track: Track
    let copyright: Copyright

    let probability: String
    let similarity: Int
}

struct Artist: Codable {
    let name : String
}

struct Track: Codable {
    let lang: Language

    let name: String
    let text: String
}

struct Language: Codable {
    let code: String
    let name: String
}

struct Copyright: Codable {
    let notice:String
    let artist: String
    let text: String
}

Разобрать ее, как показано ниже,

let result = try JSONDecoder().decode(ResultResponse.self, from: data)

Всякий раз, когда у вас есть какие-либо сомнения по поводу создания JSON Codable , Вы можете создать Кодируемый из json4swift .Вставьте вашу действительную строку JSON, и она создаст Codable объекты для вас.

app.quicktype.io - хорошее решение для создания Codable для вашего JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...