首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速JSONDecoder typeMismatch错误

快速JSONDecoder typeMismatch错误
EN

Stack Overflow用户
提问于 2017-12-29 13:06:00
回答 2查看 15.1K关注 0票数 16

我试图使用JSONDecoder在Swift中将JSON转换为Structs,所以我编写了所有的Structs,修改了几个小时,它仍然给了我这个错误。我不知道有没有办法看这条线。我将在下面发布我的结构和Json文件链接。

完整的错误描述是:

typeMismatch(Swift.Dictionary,Swift.DecodingError.Context(codingPath:[],debugDescription:“期望解码Dictionary,但找到了一个数组。”,underlyingError: 0))

代码语言:javascript
复制
//  Created by Breno Ramos on 28/12/17.
//  Copyright © 2017 brenor2. All rights reserved.
//

import Foundation

struct Owner:Decodable {
    let login               : String?
    let id                  : Double?
    let avatar_url          : String?
    let gravatar_id         : String?
    let url                 : String?
    let html_url            : String?
    let followers_url       : String?
    let following_url       : String?
    let gists_url           : String?
    let starred_url         : String?
    let subscriptions_url   : String?
    let organizations_url   : String?
    let repos_url           : String?
    let events_url          : String?
    let received_events_url : String?
    let type                : String?
    let site_admin          : Bool?
}

struct License:Decodable {
    let key     : String?
    let name    : String?
    let spdx_id : String?
    let url     : String?
}

struct Repo:Decodable {
    let id                : Double?
    let name              : String?
    let full_name         : String?
    let owner             : Owner?
    let `private`         : Bool?
    let html_url          : String?
    let description       : String?
    let fork              : Bool?
    let url               : String?
    let forks_url         : String?
    let keys_url          : String?
    let collaborators_url : String?
    let teams_url         : String?
    let hooks_url         : String?
    let issue_events_url  : String?
    let events_url        : String?
    let assignees_url     : String?
    let branches_url      : String?
    let tags_url          : String?
    let blobs_url         : String?
    let git_tags_url      : String?
    let git_refs_url      : String?
    let trees_url         : String?
    let statuses_url      : String?
    let languages_url     : String?
    let stargazers_url    : String?
    let contributors_url  : String?
    let subscribers_url   : String?
    let subscription_url  : String?
    let commits_url       : String?
    let git_commits_url   : String?
    let comments_url      : String?
    let issue_comment_url : String?
    let contents_url      : String?
    let compare_url       : String?
    let merges_url        : String?
    let archive_url       : String?
    let downloads_url     : String?
    let issues_url        : String?
    let pulls_url         : String?
    let milestones_url    : String?
    let notifications_url : String?
    let labels_url        : String?
    let releases_url      : String?
    let deployments_url   : String?
    let created_at        : String?
    let updated_at        : String?
    let pushed_at         : String?
    let git_url           : String?
    let ssh_url           : String?
    let clone_url         : String?
    let svn_url           : String?
    let homepage          : String?
    let size              : Double?
    let stargazers_count  : Double?
    let watchers_count    : Double?
    let language          : String?
    let has_issues        : Bool?
    let has_projects      : Bool?
    let has_downloads     : Bool?
    let has_wiki          : Bool?
    let has_pages         : Bool?
    let forks_count       : Double?
    let mirror_url        : String?
    let archived          : Bool?
    let open_issues_count : Double?
    let license           : License?
    let forks             : Double?
    let open_issues       : Double?
    let topics            : Topic?
    let permissions       : Permissions?
    let watchers          : Double?
    let default_branch    : String?
    //    let score             : Double?
    //    let subscribers_count : Double?
    //    let network_count     : Double?
    //    let allow_rebase_merge: Bool?
    //    let allow_squash_merge: Bool?
    //    let allow_merge_commit: Bool?

}

struct Topic:Decodable {
    let topics : [String]?
}

struct Permissions:Decodable {
    let admin : Bool
    let push  : Bool
    let pull  : Bool
}

struct RepoList:Decodable{
    let total_count        : Int?
    let incomplete_results : Bool?
    let items              : [Repo]?
}

struct User:Decodable {
    let login: String?
    let id: Double?
    let avatar_url: String?
    let gravatar_id: String?
    let url: String?
    let html_url: String?
    let followers_url: String?
    let following_url: String?
    let gists_url: String?
    let starred_url: String?
    let subscriptions_url: String?
    let organizations_url: String?
    let repos_url: String?
    let events_url: String?
    let received_events_url: String?
    let type: String?
    let site_admin: Bool?
}

struct Creator:Decodable {
    let login: String?
    let id: Double?
    let avatar_url: String?
    let gravatar_id: String?
    let url: String?
    let html_url: String?
    let followers_url: String?
    let following_url: String?
    let gists_url: String?
    let starred_url: String?
    let subscriptions_url: String?
    let organizations_url: String?
    let repos_url: String?
    let events_url: String?
    let received_events_url: String?
    let type: String?
    let site_admin: Bool?
}

struct Link:Decodable {
    let href :String?
}

struct _Links:Decodable {
    let `self`           :Link?
    let html             :Link?
    let issue            :Link?
    let comments         :Link?
    let review_comments  :Link?
    let review_comment   :Link?
    let commits          :Link?
    let statuses         :Link?
}

struct Base:Decodable {
    let label :String?
    let ref   :String?
    let sha   :String?
    let user  :User?
    let repo  :Repo?
}

struct Head:Decodable {
    let label :String?
    let ref   :String?
    let sha   :String?
    let user  :User?
    let repo  :Repo?
}

struct Milestone:Decodable {
    let url:String?
    let html_url:String?
    let labels_url:String?
    let id: Double?
    let number:Double?
    let title:String?
    let description:String?
    let creator:Creator?
    let open_issues:Double?
    let closed_issues:Double?
    let state:String?
    let created_at:String?
    let updated_at:String?
    let closed_at:String?
    let due_on:String?
}

struct Assignee:Decodable {
    let login               :String?
    let id                  :Double?
    let avatar_url          :String?
    let gravatar_id         :String?
    let url                 :String?
    let html_url            :String?
    let followers_url       :String?
    let following_url       :String?
    let gists_url           :String?
    let starred_url         :String?
    let subscriptions_url   :String?
    let organizations_url   :String?
    let repos_url           :String?
    let events_url          :String?
    let received_events_url :String?
    let type                :String?
    let site_admin          :Bool?
}

struct Reviewers:Decodable {
    let login: String?
    let id: Double?
    let avatar_url: String?
    let gravatar_id: String?
    let url: String?
    let html_url: String?
    let followers_url: String?
    let following_url: String?
    let gists_url: String?
    let starred_url: String?
    let subscriptions_url: String?
    let organizations_url: String?
    let repos_url: String?
    let events_url: String?
    let received_events_url: String?
    let type: String?
    let site_admin: Bool?
}

struct Pull:Decodable {
    let id: Double?
    let url:String?
    let html_url:String?
    let diff_url:String?
    let patch_url:String?
    let issue_url:String?
    let number:Double?
    let state:String?
    let locked:Bool?
    let title:String?
    let user:User?
    let body:String?
    let created_at:String?
    let updated_at:String?
    let closed_at:String?
    let merged_at:String?
    let merge_commit_sha: String?
    let assignee: Assignee?
    let assignees: [Assignee]?
    let requested_reviewers: [Reviewers]?
    let milestone:Milestone?
    let commits_url:String?
    let review_comments_url:String?
    let review_comment_url:String?
    let comments_url:String?
    let statuses_url:String?
    let head:Head?
    let base:Base?
    let _links:_Links?
    let author_association:String?
}

struct PullList:Decodable {
    let pulls:[Pull]?
}




/////////////////////////////////////////////////////////

1.这个结构运行得很好: 2.这个是给出typeMismatch错误的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-29 13:42:35

你现在很可能在做这个:

代码语言:javascript
复制
let decoder = JSONDecoder()
let repoList = decoder.decode(RepoList.self, from: data)

这对于顶级对象的响应来说是很好的。

要解码属于顶级数组的JSON响应,请使用如下代码:

代码语言:javascript
复制
let decoder = JSONDecoder()
let repos = decoder.decode([Repo].self, from: data)
票数 31
EN

Stack Overflow用户

发布于 2018-02-15 17:33:54

如果您有一个有问题的JSON (可以包含某些键的数字或字符串),您可以在没有该属性的情况下解码对象,并在解码后手动设置该属性。

例如,我在Vehicle中有一个HistoryItem类。在Vehicle中,model_year可以是空的String也可以是非空的Int。在这里,我使用modelYear手动解码NSDictionary,并尝试获取IntSwift 4不能自动完成它。

代码语言:javascript
复制
do {
    // Decoding HistoryItem from JSON
    let jsonData = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
    let decoder = JSONDecoder()
    let historyItem = try decoder.decode(HistoryItem.self, from: jsonData)
    if let modelYear = (dict as NSDictionary).value(forKeyPath: "vehicle.model_year") as? Int {
        historyItem.vehicle?.modelYear = modelYear
    }

    // Saving HistoryItem to Realm
    let realm = try! Realm()
    try! realm.write {
        realm.add(historyItem, update: true)
    }

} catch {
    print(error.localizedDescription)
}

这是我的Vehicle类,包含在HistoryItem中:

代码语言:javascript
复制
class Vehicle: Object, Codable {
    @objc dynamic var VIN: String = ""
    @objc dynamic var make: String?
    @objc dynamic var modelName: String?
    @objc dynamic var recallCount: Int = 0
    @objc dynamic var modelYear: Int = 0

    override static func primaryKey() -> String? {
        return "VIN"
    }

    private enum CodingKeys: String, CodingKey {
        case VIN = "vin"
        case make
        case modelName = "model_name"
        case recallCount = "recall_count"
    }
}

正如您所看到的,在model_year中没有CodingKeys密钥。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48023096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档