尝试在 swift 中使用 URLSession 解析 JSON 时出错

Error trying to parse JSON using URLSession in swift

我正在尝试从 http 地址解析测试 JSON,但我收到一条错误消息

"No value associated with key 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.

你的apireturns

[{"firstName":"Jocke","job":"developer"},{"firstName":"Anna","job":"construction"},{"firstName":"Peter","job":"pilot"}]


        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