[嵌套字典键值,在swift 4中使用可编码

问题描述 投票:0回答:1

我在下面的结构中有json

{
    "message": null,
    "data": {
        "admin": {
            "UserId": 1,
            "CUSTOMER_PROFILING": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "RISK_ASSESSMENT": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "LINK_ANALYSIS": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "BENCH_MARKING": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "SUSPICIOUS_TRANSACTION_REPORTING": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "THRESHOLD_TRANSACTION_REPORTING": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            }
        },
        "vinoth59": {
            "UserId": 15,
            "CUSTOMER_PROFILING": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "RISK_ASSESSMENT": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "LINK_ANALYSIS": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "BENCH_MARKING": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "SUSPICIOUS_TRANSACTION_REPORTING": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "THRESHOLD_TRANSACTION_REPORTING": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            }
        },
        "ba_user": {
            "UserId": 16,
            "CUSTOMER_PROFILING": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "RISK_ASSESSMENT": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "LINK_ANALYSIS": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "BENCH_MARKING": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "SUSPICIOUS_TRANSACTION_REPORTING": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            },
            "THRESHOLD_TRANSACTION_REPORTING": {
                "id": 0,
                "total": 0,
                "high": 0,
                "low": 0,
                "medium": 0
            }
        }
    },
    "status": true
}

和我的可编码类如下

struct UserRiskReportBase : Codable {
    let message : String?
    let data : [String:UserRiskReport]?
    let status : Bool?

    enum CodingKeys: String, CodingKey {

        case message = "message"
        case data = "data"
        case status = "status"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        message = try values.decodeIfPresent(String.self, forKey: .message)
        data = try values.decodeIfPresent([String:[String:BenchMarking]].self, forKey: .data)
        status = try values.decodeIfPresent(Bool.self, forKey: .status)
    }

}
struct UserRiskReport: Codable {
    let userID: Int
    let customerProfiling, riskAssessment, linkAnalysis, benchMarking: BenchMarking
    let suspiciousTransactionReporting, thresholdTransactionReporting: BenchMarking

    enum CodingKeys: String, CodingKey {
        case userID = "UserId"
        case customerProfiling = "CUSTOMER_PROFILING"
        case riskAssessment = "RISK_ASSESSMENT"
        case linkAnalysis = "LINK_ANALYSIS"
        case benchMarking = "BENCH_MARKING"
        case suspiciousTransactionReporting = "SUSPICIOUS_TRANSACTION_REPORTING"
        case thresholdTransactionReporting = "THRESHOLD_TRANSACTION_REPORTING"
    }
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        userID = try values.decodeIfPresent(Int.self, forKey: .userID)!
        customerProfiling = try values.decodeIfPresent(BenchMarking.self, forKey: .customerProfiling)!
        benchMarking = try values.decodeIfPresent(BenchMarking.self, forKey: .benchMarking)!
        riskAssessment = try values.decodeIfPresent(BenchMarking.self, forKey: .riskAssessment)!
        suspiciousTransactionReporting = try values.decodeIfPresent(BenchMarking.self, forKey: .suspiciousTransactionReporting)!
        linkAnalysis = try values.decodeIfPresent(BenchMarking.self, forKey: .linkAnalysis)!
        thresholdTransactionReporting = try values.decodeIfPresent(BenchMarking.self, forKey: .thresholdTransactionReporting)!

    }
}

struct BenchMarking : Codable {
    let id : Int?
    let total : Int?
    let high : Int?
    let low : Int?
    let medium : Int?

    enum CodingKeys: String, CodingKey {

        case id = "id"
        case total = "total"
        case high = "high"
        case low = "low"
        case medium = "medium"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        id = try values.decodeIfPresent(Int.self, forKey: .id)
        total = try values.decodeIfPresent(Int.self, forKey: .total)
        high = try values.decodeIfPresent(Int.self, forKey: .high)
        low = try values.decodeIfPresent(Int.self, forKey: .low)
        medium = try values.decodeIfPresent(Int.self, forKey: .medium)
    }
}

我能够获得第一级钥匙

let dec = JSONDecoder()
                    dec.keyDecodingStrategy = .convertFromSnakeCase
                    let alertList = try dec.decode(UserRiskReportBase.self, from:response.data!)

                    self.userRiskReportList = alertList.data!
                    self.headerArr = Array(alertList.data!.keys)

                    print(self.headerArr)

我会获得第一级密钥,例如[“ admin”,“ vinoth59”,“ ba_user”]。我需要获取第二级密钥[“ CUSTOMER_PROFILING”,“ RISK_ASSESSMENT”,.....]。如何实现使用此编码]

json swift codable
1个回答
0
投票

以下内容对我有用,请注意,我已经做了一些简化,并删除了不需要的代码,例如init(from:),并且对于很多属性,我还删除了Optional。

© www.soinside.com 2019 - 2024. All rights reserved.