簡體   English   中英

解碼 iOS Swift 中模糊類型的 JSON 屬性

[英]Decoding JSON attribute of ambiguous type in iOS Swift

您將如何編寫以下 JSON 的解碼代碼:

{
   "identifier": "1",
   "issuer": "visa",
   "pattern": [5, [7, 9]]

}

將 map 轉換為以下 model:

struct Card: Decodable {
    let identifier: String
    let issuer: String
    let pattern: [CardPattern]
}

enum CardPattern: Decodable {
    case prefix(Int)
    case range(start: Int, end: Int)
}

請注意 json 中的pattern屬性如何是兩個可能值的集合:

  • Int指示我們應該將 map 轉換為CardPattern.prefix案例
  • [Int]包含兩個值,表示我們應該將 map 轉換成CardPattern.range的情況(第一個值為start ,第二個值為end

閱讀singleValueContainer它應該可以解決您的問題。 這是一個帶有測試的工作片段......

enum CardPattern: Codable {
    case prefix(Int)
    case range(start: Int, end: Int)
    
    init(from decoder: Decoder) throws {
        let singleContainer = try decoder.singleValueContainer()
        do {
            let prefix = try singleContainer.decode(Int.self)
            self = .prefix(prefix)
            return
        } catch {
            print("Not a prefix")
        }
        
        do {
            let range = try singleContainer.decode([Int].self)
            self = .range(start: range[0], end: range[1])
            return
        } catch {
            print("Not a range")
        }
        throw NSError(domain: "Unknown type", code: -1)
    }
    
    func encode(to encoder: Encoder) throws {
        var singleContainer = encoder.singleValueContainer()
        switch self {
        case .prefix(let value):
            try singleContainer.encode(value)
        case .range(start: let start, end: let end):
            let range: [Int] = [start, end]
            try singleContainer.encode(range)
        }
    }
    
}


let data = [CardPattern.prefix(10), CardPattern.range(start: 2, end: 9)]
var encodedData: Data = Data()
do {
    encodedData = try JSONEncoder().encode(data)
    print(encodedData)
} catch {
    print("encode")
    print(error)
}
do {
    let decoded = try JSONDecoder().decode([CardPattern].self, from: encodedData)
    print(decoded)
} catch {
    print("decode")
    print(error)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM