简体   繁体   English

我在Swift 4中使用JSON Codable返回了NIL-尝试从嵌套的JSON示例返回值

[英]I return a NIL using JSON Codable in Swift 4 - trying to return a value from a nested JSON example

I am trying to retrieve JSON data from a nested structure. 我正在尝试从嵌套结构中检索JSON数据。 I have shown a trimmed down version in 'jsonString' - I have copied in return results via print statements. 我在'jsonString'中显示了精简版本-我已经通过print语句复制了返回结果。 what am I missing? 我想念什么? all I want is the ItemCount number from this JSON data. 我想要的只是该JSON数据中的ItemCount编号。 Any help would be appreciated. 任何帮助,将不胜感激。 Thank you! 谢谢!

let jsonString = """

{
    "?xml": "Json Codeable- Swift",
    "FHRSEstablishment": {
        "Header": {
            "#text":"",
            "ExtractDate":"2019-08-10",
            "ItemCount":"3789",
            "ReturnCode":"Success",
            "PageNumber":"1",
            "PageSize":"100",
            "PageCount":"38"
        }
    }
}
"""
let jsonDdata = Data(jsonString.utf8)



//rootStruct - 1
struct ratingFive : Codable {
    let xml : String?
    let fHRSEstablishment : FHRSEstablishment?


    enum CodingKeys: String, CodingKey {
        case xml = "?xml"
        case fHRSEstablishment = "FHRSEstablishment"
    }
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        xml = try values.decodeIfPresent(String.self, forKey: .xml)
        fHRSEstablishment = try FHRSEstablishment(from: decoder)
    }

}

//Struct1 - 1.1
struct FHRSEstablishment : Codable {
    let header : Header?

    enum CodingKeys: String, CodingKey {
        case header
    }
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        header = try Header(from: decoder)
    }
}

//Struct2 - 1.1.1
struct Header : Codable {

    let text : String?
    let extractDate : String?
    let itemCount : String?
    let pageCount : String?
    let pageNumber : String?
    let pageSize : String?
    let returnCode : String?


    enum CodingKeys: String, CodingKey {
        case text = "#text"
        case extractDate = "ExtractDate"
        case itemCount = "ItemCount"
        case pageCount = "PageCount"
        case pageNumber = "PageNumber"
        case pageSize = "PageSize"
        case returnCode = "ReturnCode"
    }
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        text = try values.decodeIfPresent(String.self, forKey: .text)
        extractDate = try values.decodeIfPresent(String.self, forKey: .extractDate)
        itemCount = try values.decodeIfPresent(String.self, forKey: .itemCount)
        pageCount = try values.decodeIfPresent(String.self, forKey: .pageCount)
        pageNumber = try values.decodeIfPresent(String.self, forKey: .pageNumber)
        pageSize = try values.decodeIfPresent(String.self, forKey: .pageSize)
        returnCode = try values.decodeIfPresent(String.self, forKey: .returnCode)
    }

}

do {
    let ratingResult = try JSONDecoder().decode(ratingFive.self, from: jsonDdata)
    print(ratingResult)// RETURNS:
    //ratingFive(xml: Optional("Json Codeable- Swift"), fHRSEstablishment: Optional(__lldb_expr_1.FHRSEstablishment(header: Optional(__lldb_expr_1.Header(text: nil, extractDate: nil, itemCount: nil, pageCount: nil, pageNumber: nil, pageSize: nil, returnCode: nil)))))

    print(ratingResult.xml) //RETURNS:
    //Optional("Json Codeable- Swift")

    print(ratingResult.fHRSEstablishment) //RETURNS:
    //Optional(__lldb_expr_1.FHRSEstablishment(header: Optional(__lldb_expr_1.Header(text: nil, extractDate: nil, itemCount: nil, pageCount: nil, pageNumber: nil, pageSize: nil, returnCode: nil))))

    print(ratingResult.fHRSEstablishment?.header?.itemCount) //RETURNS:
    //NIL

}catch {
    print(error)
}

I keep returning NIL when all I want is the ItemCount. 当我想要的只是ItemCount时,我一直返回NIL。

Thank you very much for your responses! 非常感谢您的回复! I've opted for a slimmed down version and removed the init: 我选择了精简版并删除了init:

//rootStruct - 1
struct ratingFive: Codable {
    let xml : String?
    let fHRSEstablishment: FHRSEstablishment?

    enum CodingKeys: String, CodingKey {
        case xml = "?xml"
        case fHRSEstablishment = "FHRSEstablishment"
    }
}

//Struct1 - 1.1
struct FHRSEstablishment : Codable {
    let Header : Header
}

//Struct2 - 1.1.1
struct Header : Codable {
    let ItemCount : String?
}


do {
    let ratingResult = try JSONDecoder().decode(ratingFive.self, from: jsonDdata)
    print(ratingResult.fHRSEstablishment!.Header.ItemCount) //RETURNS: 3789!!!
}catch {
    print(error)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM