【问题标题】:How to display JSON data from API? [duplicate]如何从 API 显示 JSON 数据? [复制]
【发布时间】:2018-03-26 05:48:13
【问题描述】:

我正在使用 Swift 4 进行开发,目前使用 Walmart 的 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
 }

我只想显示 namesalePrice 数据,但目前我无法这样做,而是收到此错误:typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: 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()



}


}

【问题讨论】:

    标签: ios json swift api codable


    【解决方案1】:

    会是这样的,

    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)
    

    【讨论】:

    • 像魅力一样工作!赞成。
    • :(你没有足够的声望来投票这么伤心
    • 我会做的:)
    • @Sh_Khan 非常感谢你
    【解决方案2】:

    您的 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)
    

    【讨论】:

    • 我刚刚尝试了代码并收到与以前相同的错误。
    • 等待编辑........
    • 谢谢!像魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 2020-09-19
    • 2021-10-31
    • 2020-01-07
    • 1970-01-01
    • 2018-09-03
    相关资源
    最近更新 更多