"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
}
}
答案 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)