WedX - журнал о программировании и компьютерных науках

Как отображать данные JSON из API?

Я разрабатываю Swift 4 и в настоящее время использую API Walmart для отображения своих продуктов и определенной информации о продуктах (например: название продукта, цена продукта). Я прочитал и просмотрел множество руководств по анализу данных JSON, однако продолжаю получать ту же ошибку. Если бы кто-нибудь мог сказать мне, почему я получаю сообщение об ошибке, я был бы очень признателен, увидев, что я застрял в этой проблеме на несколько дней.

Вот данные JSON, которые я получаю от вызова API:

{
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<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 = "https://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()



}


}
26.03.2018

Ответы:


1

Ваши данные 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)
26.03.2018
  • Я только что попробовал код и получил ту же ошибку, что и раньше. 26.03.2018
  • подожди отредактируй......... 26.03.2018
  • Спасибо! Работает как шарм. 26.03.2018

  • 2

    Это будет так,

    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)
    
    26.03.2018
  • Работает как шарм! Проголосовал. 26.03.2018
  • :( у тебя недостаточно репутации, чтобы голосовать так грустно 26.03.2018
  • Я сделаю это :) 26.03.2018
  • @Sh_Khan большое спасибо 26.03.2018
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]