簡體   English   中英

如何在 Swift 中使用可解碼?

[英]How to use Decodable in Swift?

我在我的項目中使用免費日期 API。 我正在使用Decodable來解析JSON數據。

在這里,我創建了我的結構:-

struct jsonStruct: Decodable {
var message: Bool?
var data: [dateData]
}

struct dateData: Decodable {
var quarter: Int?
var day: String?
var month: String?
}

這是我使用解碼器的代碼:-

let jsonUrlString = "https://api.lrs.org/random-date-generator?lim_quarters=40&source=api-docs"
guard let url = URL(string: jsonUrlString) else { return }
    
URLSession.shared.dataTask(with: url) { (data, reponse, err) in
    guard let data = data  else { return }
    print(data)
        
    do {
        let jsonData = try JSONDecoder().decode([dateData].self, from: data)
        print(jsonData)
    }
    catch let jsonerr {
        print("error serrializing error",jsonerr)
    }
}.resume()

但是我的代碼出現錯誤。 它只出現在 catch 塊中,我在控制台中收到此錯誤:-

錯誤序列化錯誤 typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array but found a dictionary 相反。",underlyingError: nil))

我不明白我在代碼中做錯了什么。

API 數據:-

{
messages: false,
data: {
2018-01-02: {
quarter: 1,
day: "2",
month: "1",
db: "2018-01-02",
long: "Tuesday, January 2nd, 2018",
unix: 1514876400
},

你需要

struct Root: Codable {
    let messages: Bool
    let data: [String: Datum]
}

struct Datum: Codable {
    let quarter: Int
    let day, month, db, long: String
    let unix: Int
}


let jsonData = try JSONDecoder().decode(Root.self, from: data)
print(jsonData.data.values)

由於 json 的根是字典而不是數組,因此data也是字典

jsonData.data.forEach {
  if $0 == " 2018-01-02" {
    print($1.month)
  }
}
struct Job: Decodable {
   var title: String
   var salary: Float

  init(title: String, salary: Float) {
      self.title = title
      self.salary = salary
   }

   enum CodingKeys: String, CodingKey {
     case title, salary
   }
}

struct Person: Decodable {
   var job: Job
   var firstName: String
   var lastName: String
   var age: Int

     init(job: Job, firstName: String, lastName: String, age: Int) {
       self.job = job
       self.firstName = firstName
       self.lastName = lastName
       self.age = age
   }

   enum CodingKeys: String, CodingKey {
       case job = "job_information", firstName = "firstname", lastName = 
       "lastname", age
    }
}

let rawData = """
 {
    "job_information": {
      "title": "iOS Developer",
      "salary": 5000
   },
   "firstname": "John",
   "lastname": "Doe",
    "age": 20
}
 """.data(using: .utf8)!


let person = try JSONDecoder().decode(Person.self, from: rawData)
print(person.firstName) // John
print(person.lastName) // Doe
print(person.job.title) // iOS Developer

暫無
暫無

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

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