json - 解析 Json 显示错误 keyNotFound Swift

标签 json swift xcode parsing

我想解析 json,但 Xcode 显示此消息:keyNotFound(CodingKeys(stringValue: "Id", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "没有关联的值带有键 CodingKeys(stringValue:\"Id\", intValue: nil) (\"Id\").",underlyingError: nil))

JSON:

{
    "result": [
        {
            "Id": 5,
            "Title": "Test1",
            "EnTitle": "Story and Novel"
        },
        {
            "Id": 38,
            "Title": "Test2",
            "EnTitle": " Motivational"
        }

    ],
    "status": {
        "message": "Confirm",
        "success": true,
        "systemDateTime": "2019-11-01T12:07:05+03:30",
        "httpStatusCode": 200
    }
}

型号:

struct Result : Decodable {
    let Id : Int
    let Title : String
    let EnTitle : String
}

class ResultInitialiser {

    let Id : Int
    let Title : String
    let EnTitle : String

    init(Id:Int, Title:String, EnTitle: String) {
        self.Id = Id
        self.Title = Title
        self.EnTitle = EnTitle
    }

}

View Controller :

var genresFetch = [Result]()
var structGenresFetch = [ResultInitialiser]()
let headers : HTTPHeaders = ["Token" : "6f8652e3-d9d9-4b34-9455-0fa32e82ec58"]

    AF.request(BASE_URL!, method: .get, headers: headers).response { (response) in
        do {
            self.genresFetch = [try JSONDecoder().decode(Result.self, from: response.data!)]

                for eachProduct in self.genresFetch {

                    let recived_Data = ResultInitialiser(Id: eachProduct.Id, Title: eachProduct.Title, EnTitle: eachProduct.EnTitle)
                    self.structGenresFetch.append(recived_Data)
                    print(eachProduct.Title)
                    DispatchQueue.main.async {
                  self.tvMainApi.reloadData()
                    }
                }
        }catch {
            print(error)
        }
    }

最佳答案

JSONDecoder 将尝试从根开始解码 JSON。在根级别,只有两个键,resultsstatus。您传递给它的 Decodable 类型 Result 没有这些键。

您需要创建另一个结构:

struct Response {
    let results: [Result]
}

并解码此结构:

    do {
        // notice the change to this line
        self.genresFetch = try JSONDecoder().decode(Response.self, from: response.data!).results
        ...
    }catch {
        print(error)
    }

IMO,您不需要名为 ResultInitialiser 的额外 class。仅使用结构体作为模型有什么问题?

关于json - 解析 Json 显示错误 keyNotFound Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59124107/

相关文章:

ios - 如何使用 IAP 在不同国家以适当的货币显示价格

ios - 如果 Xcode 不再支持 armv6,你如何为 < iOS 4.3 构建/分发?

ios - 管理设备方向 - IOS

ios - 如何设置按钮的背景颜色 - xcode

javascript - jQuery.getJSON() 不工作

javascript - 我怎样才能使这段 Javascript 代码不引人注目?

ios - 在 Alamofire 请求参数中传递 CSRF token

ios - 打开带有对象的 View

javax.json.stream.JsonGenerator 在接近文件末尾时突然结束输出

java - XML 转换为 JSON 时前导零被截断