无法从JSON获取字典

时间:2018-06-24 01:50:11

标签: json swift jsondecoder

这是我正在使用的代码,但无法获取JSON。

错误消息:

  

打算对Dictionary进行解码,但找到一个数组。

func getMovieByName(completion: @escaping (Bool, Any?, Error?) -> Void) {
    guard let url = URL(string:"https://api.themoviedb.org/3/search/movie?api_key=4cb1eeab94f45affe2536f2c684a5c9e&query='star") else { return }

    let session = URLSession.shared
    let task = session.dataTask(with: url) { (data, _, _) in
        guard let data = data else { return  }
        do {
            let items = try JSONDecoder().decode(ItemList.self, from: data)

            DispatchQueue.main.async {
                completion(true, items, nil)
            }
        } catch {
            DispatchQueue.main.async {
                completion(false, nil, error)
            }
        }
    }
    task.resume()
}

JSON:

{
    "page": 1,
    "total_results": 2102,
    "total_pages": 106,
    "results": [{
        "vote_count": 9052,
        "id": 11,
        "video": false,
        "vote_average": 8.2,
        "title": "Star Wars",
        "popularity": 31.502792,
        "poster_path": "/btTdmkgIvOi0FFip1sPuZI2oQG6.jpg",
        "original_language": "en",
        "original_title": "Star Wars",
        "genre_ids": [
            12,
            28,
            878
        ],
        "backdrop_path": "/4iJfYYoQzZcONB9hNzg0J0wWyPH.jpg",
        "adult": false,
        "overview": "Princess Leia is captured and held hostage by the evil Imperial forces in their effort to take over the galactic Empire. Venturesome Luke Skywalker and dashing captain Han Solo team together with the loveable robot duo R2-D2 and C-3PO to rescue the beautiful princess and restore peace and justice in the Empire.",
        "release_date": "1977-05-25"
    }]
}

struct Results: Codable    {
    let id: Int
    let title: String
    let poster_path: String


struct ItemList: Codable {
    let results: Results
}

}

2 个答案:

答案 0 :(得分:1)

您可以为此创建一个Swift Struct。这是您的操作方式。

class SportCategory(Base):
__tablename__ = 'category'

id = Column(Integer, primary_key=True)
name = Column(String(250), nullable=False)


class MenuItem(Base):
__tablename__ = 'menu_item'

id = Column(Integer, primary_key=True)
name = Column(String(80), nullable=False)
description = Column(String(1000))
price = Column(String(8))
date = Column(Integer)
sport_id = Column(Integer, ForeignKey('category.id'))
sport = relationship(SportCategory)

创建结构后,可以执行类似的操作来解析数据。

import Foundation

struct MovieStruct: Codable {
    let page, totalResults, totalPages: Int?
    let results: [Result]?

    enum CodingKeys: String, CodingKey {
        case page
        case totalResults = "total_results"
        case totalPages = "total_pages"
        case results
    }
}

struct Result: Codable {
    let voteCount, id: Int?
    let video: Bool?
    let voteAverage: Double?
    let title: String?
    let popularity: Double?
    let posterPath, originalLanguage, originalTitle: String?
    let genreIDS: [Int]?
    let backdropPath: String?
    let adult: Bool?
    let overview, releaseDate: String?

    enum CodingKeys: String, CodingKey {
        case voteCount = "vote_count"
        case id, video
        case voteAverage = "vote_average"
        case title, popularity
        case posterPath = "poster_path"
        case originalLanguage = "original_language"
        case originalTitle = "original_title"
        case genreIDS = "genre_ids"
        case backdropPath = "backdrop_path"
        case adult, overview
        case releaseDate = "release_date"
    }
}

注意,我已经使用给定的JSON创建了结构。希望对您有所帮助。

答案 1 :(得分:0)

Y[2, 3] = np.array([
    [0, 0, 0, 3, 0],
    [0, 0, 0, 4, 0],
    [0, 0, 0, 5, 0],
    [0, 0, 0, 6, 0]
])

结果结构包含“结果”的内容

func getMovieByName(completion: @escaping (Bool, Any?, Error?) -> Void) {
    guard let url = URL(string:"https://api.themoviedb.org/3/search/movie?api_key=4cb1eeab94f45affe2536f2c684a5c9e&query='star") else { return }

    let session = URLSession.shared
    let task = session.dataTask(with: url) { (data, _, _) in
        guard let data = data else { return  }
        do {
            let items = try JSONDecoder().decode(Result.self, from: data)

            DispatchQueue.main.async {
                completion(true, items, nil)
            }
        } catch {
            DispatchQueue.main.async {
                completion(false, nil, error)
            }
        }
    }
    task.resume()
}

添加变量以与项目的字段相对应

struct Result: Codable {
    var results: [Movie]
}