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

标签 json swift data-structures jsondecoder swift-structs

我正在尝试从嵌套结构中检索 JSON 数据。我在“jsonString”中显示了一个精简版本 - 我已通过 print 语句复制了返回结果。我缺少什么?我想要的只是此 JSON 数据中的 ItemCount 数字。任何帮助,将不胜感激。谢谢!

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)
}

当我想要的只是 ItemCount 时,我一直返回 NIL。

最佳答案

非常感谢您的回复!我选择了精简版本并删除了 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)
}

关于json - 我在 Swift 4 中使用 JSON Codable 返回 NIL - 尝试从嵌套 JSON 示例返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57506940/

相关文章:

json - 结构中的golang解码(反序列化)变量类型字典

php - $_GET 和 isset() url 响应 Json

java - 如何在配置单元中使用 serde 上传 twitter json 数据?

c++ - 为什么 malloc() 基于链表?

c++ - 将模板类型参数的映射存储到 C++ 中的 Vector : Visual Studio

algorithm - 从体素列表创建邻域图比 O(n^2) 更快?

javascript - JSON、Fabric 和 IText 的错误

ios - 如何使用 UISwitch 关闭本地通知?

ios - 如何在将 UIViewController 呈现给自定义时更改默认转换

ios - 覆盖协议(protocol)扩展默认实现