为什么当我使用JSONDecoder

时间:2019-12-24 11:46:45

标签: ios json swift decodable jsondecoder

(未知上下文,价格为$ 10741e078)。CodingKeys>,Swift.DecodingError.Context(codingPath:[],debugDescription:“无法获取带密钥的解码容器-而是找到了空值。”,底层错误:无)

我的模型是,

struct Details : Decodable {

    var userInfo : RequestUserInfo
    var commercialInfo : String?

}

struct RequestUserInfo : Decodable {

    var UserName : String?
    var Email : String?
    var UserIdentity : String?
    var UserMobile : String?
    var ThirdName : String?
    var LastName : String?
    var IdIssueDate : String?
    var IdSourceCity : String?


}

(未知上下文,价格为$ 10741e078)。CodingKeys>,Swift.DecodingError.Context(codingPath:[],debugDescription:“无法获取带密钥的解码容器-而是找到了空值。”,底层错误:无)

3 个答案:

答案 0 :(得分:2)

您需要在JSON中期望Optional (?)的任何位置将类型标记为 null

但是,上述解析的问题与您在问题中描述的问题不同。

  

typeMismatch(Swift.String,Swift.DecodingError.Context(codingPath:   [CodingKeys(stringValue:“ newRequest”,intValue:nil),   CodingKeys(stringValue:“ parcels”,intValue:nil),   _JSONKey(stringValue:“ Index 0”,intValue:0),CodingKeys(stringValue:“ UsingPurposeId”,intValue:nil)],debugDescription:“预期   解码字符串,但找到一个数字。”,underlyingError:nil))

可以这样解决

UsingPurposeIdBuildingRequestParcelDetails的类型必须为Int?而不是String?

按以下方式解析数据,

do {
    let response = try JSONDecoder().decode(BuildingRequestDetails.self, from: data)
    print(response)
} catch {
    print(error)
}

答案 1 :(得分:0)

您可以使用此ModelAPI-https://app.quicktype.io?share=NYC0PgFnypeo5cLho3sH 并使用代码self.requestDetail = try JSONDecoder().decode(ModelAPI.self, from: json)进行调用。我已经检查了并且可以正常工作。另外,我还修复了您的JSON(两行错误)

答案 2 :(得分:0)

在您的情况下,如果 Details.userInfo == nil

设置

var userInfo : RequestUserInfo?

您的错误将消失。 但实际上,您的错误隐藏在错误的数据中。解码前先尝试添加字符串:

print(String(data:  data, encoding: .ascii))

并仔细检查一切正常。 例如,您可能会获得“ user_info”而不是键“ userInfo”