Ios 如何显示API中的JSON数据?

Ios 如何显示API中的JSON数据?,ios,json,swift,api,codable,Ios,Json,Swift,Api,Codable,我正在Swift 4中开发,目前正在使用沃尔玛的API来显示他们的产品和有关产品的某些信息(例如:产品名称、产品价格)。我已经阅读并观看了许多关于解析JSON数据的教程,但是我仍然会遇到同样的错误。如果有人能告诉我为什么我会出错,我会非常感激,因为我已经在这个问题上坚持了好几天了 下面是我从API调用中获得的JSON数据: { query: "ipod", sort: "relevance", format: "json", responseGroup: "base", totalResults

我正在Swift 4中开发,目前正在使用沃尔玛的API来显示他们的产品和有关产品的某些信息(例如:产品名称、产品价格)。我已经阅读并观看了许多关于解析JSON数据的教程,但是我仍然会遇到同样的错误。如果有人能告诉我为什么我会出错,我会非常感激,因为我已经在这个问题上坚持了好几天了

下面是我从API调用中获得的JSON数据:

{
query: "ipod",
sort: "relevance",
format: "json",
responseGroup: "base",
totalResults: 3570,
start: 1,
numItems: 10,
items: [
{
    itemId: 15076191,
    parentItemId: 15076191,
    name: "Apple iPod Touch 4th Generation 32GB with Bonus Accessory Kit",
    salePrice: 189
 }
我只想显示
name
salePrice
数据,但目前无法显示,而是出现以下错误:
typeMismatch(Swift.Array,Swift.DecodingError.Context(codingPath:[],debugDescription:“预期解码数组,但找到了字典。”,underyingerror:nil))

以下是我的数据模型:

  struct Product: Codable {
    let name: String
    let salePrice: String

}
以下是我的ViewController类中的代码:

class ViewController: UIViewController {


import Foundation
import UIKit    


var products: [Product]?
override func viewDidLoad() {
    super.viewDidLoad()



    let urlString = "http://api.walmartlabs.com/v1/search?query=sauce&format=json&apiKey=xyz"
    guard let url = URL(string: urlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, error) in
        if error != nil {
            print(error!.localizedDescription)
        }

        guard let data = data else { return }
        //Implement JSON decoding and parsing
        do {
            //Decode retrived data with JSONDecoder and assing type of Article object
            let productData = try JSONDecoder().decode([Product].self, from: data)
            print(productData)

        } catch let jsonError {
            print(jsonError)
        }

    }.resume()



}


}

您的json数据是一个字典,而不是一个数组。您可以解析它并获取数组,或者尝试以下方法

struct Item: Codable {
   let query: String
   let sort: String
   let format: String
   let responseGroup: String
   let totalResults: Int
   let start: Int
   let numItems: Int
   let items: [Product]

}

struct Product: Codable {
   let itemId: Double 
   let parentItemId: Double 
   let name: String
   let salePrice: Int

}

let productData = try JSONDecoder().decode(Item.self, from: data)
就是这样,

struct Item: Codable {
    let query: String
    let sort: String
    let responseGroup: String
    let totalResults: Int
    let start: Int
    let numItems: Int
    let items: [Product]
}

struct Product: Codable {
    let name: String
    let salePrice: CGFloat
}
试着用这个

let productData = try JSONDecoder().decode(Item.self, from: data)

我刚刚尝试了代码,收到了与以前相同的错误。等待编辑…。谢谢!很有魅力,很有魅力!向上投票。:(你没有足够的声望来向上投票,所以萨迪会这么做:)@shu Khan非常感谢你