簡體   English   中英

無法在 swift 中解碼 json

[英]not able to decode json in swift

這是 http 客戶端,打印字符串時響應正確,但在嘗試解碼時顯示轉換錯誤

 let task = URLSession.shared.dataTask(with: request){ (data, response, error) in
                
                // Check for Error
                if let error = error {
                    print("Error took place \(error)")
                    return
                }
            do{
                let imageData = try JSONDecoder().decode(ImageDataModel.self,
                                                         from: data!)
                print(imageData)
            }catch{
                print("conversion error")
            }
  
            
        }

這是用來解碼的數據model


struct ImageDataModel: Decodable,Identifiable {
    var id = UUID()
    var created: Int
    var data:Array<ImageData>

    struct ImageData: Decodable,Identifiable {
        var id = UUID()
        var url: String
    }

    init(created: Int, data: [ImageData]) {
        self.created = created
        self.data = data
    }
}

回應是

{
    "created": 1670598580,
    "data": [
        {
            "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-t0OU052mWtWLkmxpWHfSoME9/user-mgq3wJsAIptbbj1l0yI0YIS4/img-WafK921SOTYJSY0oub4e0z4f.png?st=2022-12-09T14%3A09%3A40Z&se=2022-12-09T16%3A09%3A40Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-12-09T01%3A07%3A28Z&ske=2022-12-10T01%3A07%3A28Z&sks=b&skv=2021-08-06&sig=McfqQuL5FZ%2B0Ow1qms3i3phdYMZjmxcoNcfr4/7/XPk%3D"
        },
        {
            "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-t0OU052mWtWLkmxpWHfSoME9/user-mgq3wJsAIptbbj1l0yI0YIS4/img-FgLNjPkxOcKk0wOz5pGKYO5c.png?st=2022-12-09T14%3A09%3A40Z&se=2022-12-09T16%3A09%3A40Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-12-09T01%3A07%3A28Z&ske=2022-12-10T01%3A07%3A28Z&sks=b&skv=2021-08-06&sig=h72lRrBUed0HKHkS3QEHy2RzfM65xbwtlJMM1NGK9w0%3D"
        },
        {
            "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-t0OU052mWtWLkmxpWHfSoME9/user-mgq3wJsAIptbbj1l0yI0YIS4/img-mV5jtC9UQatb3zoDVG8lQw4u.png?st=2022-12-09T14%3A09%3A40Z&se=2022-12-09T16%3A09%3A40Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-12-09T01%3A07%3A28Z&ske=2022-12-10T01%3A07%3A28Z&sks=b&skv=2021-08-06&sig=pYrewa9h/B0gzOp7NwfzYwjdVlG4%2BwkpJCXdzuEw9HY%3D"
        },
        {
            "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-t0OU052mWtWLkmxpWHfSoME9/user-mgq3wJsAIptbbj1l0yI0YIS4/img-PjwW7ctrLEjFkIuctE71V2jj.png?st=2022-12-09T14%3A09%3A40Z&se=2022-12-09T16%3A09%3A40Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-12-09T01%3A07%3A28Z&ske=2022-12-10T01%3A07%3A28Z&sks=b&skv=2021-08-06&sig=Mznigp33qXj1f2yO1kUfxiwJOG2XiAfKpXdBQBavu8Q%3D"
        },
        {
            "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-t0OU052mWtWLkmxpWHfSoME9/user-mgq3wJsAIptbbj1l0yI0YIS4/img-3vZsW3Tr82PELAH2QDnGz2im.png?st=2022-12-09T14%3A09%3A40Z&se=2022-12-09T16%3A09%3A40Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2022-12-09T01%3A07%3A28Z&ske=2022-12-10T01%3A07%3A28Z&sks=b&skv=2021-08-06&sig=cIwENFt/fWP12wLtr%2BNQks6OuCgB%2BZORsT6dxHbk7ys%3D"
        }
    ]
}

我期望將收到的 json 存儲到結構中

錯誤很明顯:

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

您聲明了一個id屬性,但 JSON 中沒有密鑰id

基本上有兩種選擇:

  1. id聲明為常量。 無論如何聲明一個唯一標識符可變是沒有意義的

    let id = UUID()

    您將收到警告,但可以忽略。

  2. 指定顯式CodingKeys省略id

     struct ImageDataModel: Decodable, Identifiable { private enum CodingKeys: String, CodingKey { case created, data} let id = UUID() var created: Int var data: Array<ImageData> struct ImageData: Decodable, Identifiable { private enum CodingKeys: String, CodingKey { case url }...

旁注:切勿在catch塊中只打印無意義的文字字符串。 總是至少打印error實例

 } catch {
     print("conversion error", error)
 }

暫無
暫無

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

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