簡體   English   中英

嘗試在 swift 中使用 URLSession 解析 JSON 時出錯

[英]Error trying to parse JSON using URLSession in swift

我正在嘗試從http地址解析測試JSON ,但我收到一條錯誤消息

"沒有與鍵 CodingKeys(stringValue: \\"name\\", intValue: nil) 關聯的值

JSON看起來像這樣。 它已經過驗證,所以它應該可以正常工作:

{
  "work": [
    {
      "name": "Jocke",
      "job": "Developer",
      "date": "1985-12-30T00:00:00+0000",
      "best_book": {
        "id": 33245,
        "title": "DiscWorld",
        "author": {
          "id": 345,
          "name": "Terry Prattchet"
        }
      }
    },
    {
      "name": "Bob",
      "job": "Construction worker",
      "date": "2010-01-30T00:00:00+0000",
      "best_book": {
        "id": 375802,
        "title": "Ender's Game (Ender's Saga, #1)",
        "author": {
          "id": 589,
          "name": "Orson Scott Card"
        }
      }
    }
  ]
}

代碼如下所示:


struct People: Codable {
    let name: String
    let job: String

    enum OuterKey: String, CodingKey {
        case work = "work"
    }

    enum codingKeys: String, CodingKey {
        case name = "name"
        case job = "job"
    }

    init(decoder: Decoder) throws {
        let outerContainer = try decoder.container(keyedBy: OuterKey.self)
        let innerContainer = try outerContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: .work)
        self.name = try innerContainer.decode(String.self, forKey: .name)
        self.job = try innerContainer.decode(String.self, forKey: .job)
    }

}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        guard let url = URL(string: "https://api.myjson.com/bins/fe2eo") else { return }

        URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data else { return }

            do {
                let jsonDecoder = JSONDecoder()
                jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase

                let decodedJson = try! jsonDecoder.decode([People].self, from: data)
            }
        }.resume()
    }
}

我現在只是想掌握前兩個keys ,看看它是否有效。 但它甚至沒有過去name

你的 api 返回

[{"firstName":"Jocke","job":"developer"},{"firstName":"Anna","job":"construction"},{"firstName":"Peter","job": “飛行員”}]


        do {
            let jsonDecoder = JSONDecoder()
            let decodedJson = try jsonDecoder.decode([People].self, from: data)
           }
         catch {
            print(error)
         }


struct People: Codable {
    let firstName, job: String
}

試試這個

struct Work:Codeable {
  let work:[People]
}

struct People: Codable {
    let name: String
     let job: String
    }

     do {
          let jsonDecoder = JSONDecoder()
          let decodedJson = try jsonDecoder.decode(Work.self, from: data)
         }
   catch {
           print(error)
          }

如果您的名稱與 json 密鑰相同,則不需要使用codingkeys

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM