如何在swift 4中使用API​​解析jsondata

时间:2018-06-14 10:50:05

标签: ios json iphone swift

 "collection_listings" =     (
            {
        "body_html" = "";
        "collection_id" = 57229082710;
        "default_product_image" = "<null>";
        handle = men;
        image =             {
            "created_at" = "2018-05-02T01:34:16-04:00";
            src = "https://cdn.shopify.com/s/files/1/2331/3377/collections/men.jpg?v=1525239256";
        };
        "published_at" = "2018-05-02T01:34:16-04:00";
        "sort_order" = manual;
        title = Men;
        "updated_at" = "2018-05-02T08:01:58-04:00";
    }

如何使用swift 4在模拟器中打印此数据? 在我尝试打印此数据时,我收到此错误:

  

typeMismatch(Swift.Array,Swift.DecodingError.Context(codingPath:   [],debugDescription:&#34;预计解码数组但发现了一个   而不是字典。&#34;,underlyingError:nil))

这是我更新的代码:

导入UIKit

struct product:可解码 {    let product_id:String     let title:String    让image:String }

类ViewController:UIViewController,UICollectionViewDataSource {     var products = product

@IBOutlet weak var productCell: UICollectionView!

override func viewDidLoad()
{
    super.viewDidLoad()

    productCell.dataSource = self

  guard let url = URL(string: "https://psofttech-test.myshopify.com/admin/collection_listings.json") else { return }
    var request = URLRequest(url: url)
    request.httpMethod = "GET"

    let session = URLSession.shared
    session.dataTask(with: url) { (data, response, error) in
        if error == nil
        {
            do
            {
                let json = try JSONSerialization.jsonObject(with: data!) as? [String: Any]
                self.products = try JSONDecoder().decode([product].self, from: data!)
                print(self.products, "dddd")

                for info in self.products
                {
                    self.productCell.reloadData()
                }
            }
            catch
            {
                print(error)
            } 
        }
        }.resume()

    print(products.self,"0000")

}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
    return products.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "productCollection", for: indexPath) as! productCollectionViewCell
    cell.proLBL.text = products[indexPath.row].title

    return cell
}

}

3 个答案:

答案 0 :(得分:0)

查看此代码是否可以帮助您..

if let data = data as? [String: Any] {
        if let data = data["collection_listings"] as? NSArray {
            for data in data {
                if let data = data as [String: Any] {

                }
            }
        }
    }

答案 1 :(得分:0)

现在你可以使用codable来解析Swift 4.0中的json数据。

  • 使用Codable,我们可以将JSONObject或PropertyList文件建模为 通过编写非常少的代码行来等效的Struct或类。我们 不必为。中的属性编写构造函数 对象。这完全由Codable提出。我们只需要扩展我们的模型 符合Codable,Decodable或Encodable协议。

  • Swift的强数据类型与丢失数据类型不匹配 JSON的内容由Swift编译器内部处理。我们现在可以 处理Swift数据类型,如Date,URL,Float等

  • 使用Nesting Structs可以轻松地对复杂JSON进行建模 可读性。

  • 使用JSONDecoder解析实际的JSON成为单行

您可以参考此应用使用可编码:Demo App for Codable Swift

答案 2 :(得分:0)

您正在使用错误的对象进行解码。基本上它告诉你发送给解码器的对象类型与JSON不匹配。在你的情况下(没有看到你的代码,很难确切地说),你提供的对象似乎是数组类型,而JSON是一个字典。这是我通常使用的方法:

指定要解码的类型的结构:

struct Response {
    var collection_listings: Listing
}

struct Listing {
    var collection_id: String
}

在您的解码器中具体包括:

let decoder = JSONDecoder()
let apiResponse = try decoder.decode(Response.self, from: data)