如何将图像从JSON解析为swift4

时间:2018-03-18 16:27:25

标签: json swift codable decodable encodable

我正试图在swift中从我的数据库中提取图像。我可以检索价格,视频和p_name,但不能检索图像。我想用数据库中的图像更新updateImage UIImageView但我得到两个错误。

错误一说:

  

类型'ViewController.Class'不符合协议'Encodable'

错误二说:

  

类型'ViewController.Class'不符合协议'Dec

对此有哪些好的解决方法?

这是JSON:

{
"id":"1",
"p_name":"item_one",
"image":"item_one.png"
}
{
"id":"2","p_name":
"item_two","image":
"item_two.img"
}

快速代码:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var updateLabel: UILabel!

@IBOutlet weak var updateImage: UILabel!

struct Class: Codable
{
    let id: String
    let p_name: String
    let image: String

}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let url = URL(string: "http://host-2:8888//getClasses.php")

    // Load the URL
    URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) in
        // If there are any errors don't try to parse it, show the error
        guard let data = data, error == nil else { print(error!); return }

        let decoder = JSONDecoder()
        let classes = try! decoder.decode([Class].self, from: data)
        // Print out the classes to the console - try sticking this in a table view :)
        for myClass in classes {

            self.updateLabel.text = myClass.p_name
            self.updateImage.text = myClass.image

        }

    }).resume()

    }
}

1 个答案:

答案 0 :(得分:0)

首先,如果您从API获取的密钥与Codable Type中的属性名称相同,那么您不需要明确指定enum CodingKeys,即您可以简单地使用方法:

struct Class: Codable
{
    let id: String
    let p_name: String
    let image: String
}

据我了解,您必须以下列方式解码您获得的JSON data

    let jsonString = """
    [
        {"id": "1", "p_name": "P1", "image": "V1"},
        {"id": "2", "p_name": "P2", "image": "V2"},
        {"id": "3", "p_name": "P3", "image": "V3"}
    ]
    """
    if let jsonData = jsonString.data(using: .utf8)
    {
        let obj = try? JSONDecoder().decode([Class].self, from: jsonData)
        print(obj)
    }

在上面的代码中,我刚刚使用了样本JSON string。要获得更多说明,您必须添加从API获得的确切JSON响应。

现在,如果您还期待来自API的图片网址,则您还没有添加任何属性来将该网址字符串存储在struct Class中。

一旦您在问题中添加更多信息,我就能为您提供更多帮助。