【问题标题】:Xcode Swift Argument type does not conform to expected type 'Decoder'Xcode Swift 参数类型不符合预期类型“解码器”
【发布时间】:2020-04-30 22:45:40
【问题描述】:

我使用 URLSession 和 Xcode 11.3 的“解码器”有点问题。这是错误消息参数类型“数据”不符合预期的类型“解码器”检查一下

JSON

[
    {
        "id": 1,
        "titel": "Telefonständer",
        "ersteller": "von Mike-vom-Mars",
        "urlLink": "https://www.thingiverse.com/thing:3513800",
        "mehr": "Faltbarer Tablet- und Handyhalter, der fünf verschiedene Kipppositionen ermöglicht. Dieser Halter benötigt keine Schrauben, einfach ausdrucken und zusammenstecken. Sehr stabil, platzsparend und tragbar."
    },
    {
        "id": 2,
        "titel": "Tool Caddy",
        "ersteller": "von Tom Link",
        "urlLink": "https://www.thingiverse.com/thing:2849473",
        "mehr": "Ein einfacher Werkzeugwagen für den 3D-Druck. Ca. 4,75 x 3,125 x 1,3 Zoll. Hält Messer, Pinzetten, Rasierklingenschaber, Klebestift, SD-Kartenadapter und ein Abfallfach."
    },
    {
        "id": 3,
        "titel": "Honey, I'm Home!",
        "ersteller": "von Luz Cabrera und Malorie Pangilinan",
        "urlLink": "https://www.behance.net/gallery/16925735/Honey-Im-Home",
        "mehr": "Honig-Schlüsselanhänger. Wenn Sie direkt auf die endgültige Farbe drucken, empfehle ich, 100% für das Rahmenteil und 105% für die kleinen Teile zu verwenden, damit sie besser in die Löcher passen. Wenn Sie jedoch die Teile bemalen, empfehle ich 100% beide."
    }
]

func getRequest(completion: @escaping ([Model]?) -> Void) {
    let url = URL(string: "http://localhost" + ":" + "8080" + "/" + "printdata")!

    let task = URLSession.shared.dataTask(with: url) {
        (data, response, error) in
        let jsonDecoder = JSONDecoder()
        if let data = data,
            var categories = try? jsonDecoder.decode([Model].self, from: data) {
            completion(categories)

            for reply in data{
                print("Show: \(reply)")
                categories.append(Model(from: data))

            }
        } else {
            print("ERROR")
            completion(nil)
        }
        //debugPrint(String(data: data!, encoding: .utf8))
    }
    task.resume()
}

还有我的模特:

struct Model: Decodable{
    var id: Int
    var titel: String
    var ersteller: String
    var mehr: String
    var urlLink: String?

    init(id: Int, titel: String, ersteller: String, mehr: String, urlLink: String) {
        self.id = id
        self.titel = titel
        self.ersteller = ersteller
        self.mehr = mehr
        self.urlLink = urlLink
    }

}

【问题讨论】:

  • 添加你得到的 JSON。
  • 这段代码与 Alamofire 完全无关,为什么你要解码两次数据?顺便说一句reply 是一个字节,循环没有意义。
  • 一开始不是Alamofire,你使用的是URLSession。添加您的 Json 数据响应以检查解码错误。

标签: ios swift xcode urlsession


【解决方案1】:

循环for reply in data没有意义,数据已经完全解码,删除它,这样可以修复错误。

不要try?,总是捕捉错误。

func getRequest(completion: @escaping ([Model]?) -> Void) {
    let url = URL(string: "http://localhost" + ":" + "8080" + "/" + "printdata")!

    let task = URLSession.shared.dataTask(with: url) {
        (data, response, error) in
        if let error = error {
           print("Connection error", error)
           completion(nil)
        } else {
           do {
               let jsonDecoder = JSONDecoder()
               let categories = try jsonDecoder.decode([Model].self, from: data!)
               completion(categories)
           } catch {
               print("Decoding error", error)
               completion(nil)
           }
        }
        //debugPrint(String(data: data!, encoding: .utf8))
    }
    task.resume()
}

Model 中的 init 方法是不需要的,结构成员可能是常量

struct Model: Decodable {
    let id: Int
    let titel: String
    let ersteller: String
    let mehr: String
    let urlLink: String?
}

【讨论】:

    【解决方案2】:

    也许你得到的 JSON 不是 Model 数组?

    你可以打印出响应字符串来检查你是否得到了正确的类型。

    【讨论】:

    • 可选( { URL: localhost:8080/printdata } { 状态码: 200, Headers { Connection = ( "keep-alive" ); "Content-Length" = ( 1068 ); "Content-Type" = ("application/json; charset=utf-8" ); Date = ("Tue, 14 Jan 2020 09:00:41 GMT" ); } }) 我想是的
    • 使用 String(data: data, encoding: String.Encoding.utf8) 将 NSData 转换为 String 以查看您从响应中得到了什么。我想你可能会得到一个 JSONObject 而不是 JSONArray。 @欧内斯特
    【解决方案3】:

    您的 responsedata 似乎与 struct 中的项目不匹配。评论只是回应

    Optional({ URL: localhost:8080/printdata } { 状态码: 200, Headers { Connection = ( "keep-alive" ); "Content-Length" = ( 1068 ); "Content-Type" = ( " application/json; charset=utf-8" ); Date = ( "Tue, 14 Jan 2020 09:00:41 GMT" ); } ckquote

    。请将您获得的数据转换为 JSON/String 并在此处发布。这将有助于我们回答

    【讨论】:

      猜你喜欢
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      相关资源
      最近更新 更多