【问题标题】:Error trying to parse JSON using URLSession in swift尝试在 swift 中使用 URLSession 解析 JSON 时出错
【发布时间】:2020-04-30 01:37:53
【问题描述】:

我正在尝试从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

【问题讨论】:

    标签: ios json swift parsing urlsession


    【解决方案1】:

    你的 api 返回

    [{"firstName":"Jocke","job":"developer"},{"firstName":"Anna","job":"construction"},{"firstName":"Peter","工作":"飞行员"}]


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

    【讨论】:

      【解决方案2】:

      试试这个

      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

      【讨论】:

      • 好的,现在可以使用了。谢谢您的帮助!比使用codingKey好很多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多