【问题标题】:parsing Json in swift4在swift4中解析Json
【发布时间】:2018-02-21 12:50:49
【问题描述】:

你好,我尝试解码 Json:

{“结果”:[ {"ID":"80", "时间":"09:00:00", “地位”:[ {"status":0,"kirpeja_id":"74","name":"Natalja","image":"natalija255.png","duration":"00:20:00"}, {"status":1,"kirpeja_id":"80","name":"Lina","image":"kazkas.png","duration":"00:30:00"}, {"status":0,"kirpeja_id":"82","name":"Rasa","image":"IMG_20170906_171553.jpg","duration":"00:40:00"} ]}, {"ID":"81", "时间":"09:10:00", “地位”:[ {"status":0,"kirpeja_id":"66","name":"Ilona","image":"ilona_new.jpg","duration":"00:30:00"}, {"status":0,"kirpeja_id":"74","name":"Natalja","image":"natalija255.png","duration":"00:20:00"}, {"status":0,"kirpeja_id":"80","name":"Lina","image":"kazkas.png","duration":"00:30:00"}, {"status":0,"kirpeja_id":"82","name":"Rasa","image":"IMG_20170906_171553.jpg","duration":"00:40:00"} ]}, ...

这是我的课

class TimeStatusResult: Codable {
let result: [TimeStatus]
init (result:[TimeStatus]) {
self.result = result
}
}
class TimeStatus: Codable {
let ID:String?
let time: String?
let status: [Status]
init (status:[Status]) {
    self.ID = ""
    self.time = ""
    self.status = status
}
}
class Status: Codable {
let status: String?
let kirpeja_id: String?
let name: String?
let image: String?
let duration: String?
init () {
    self.status = ""
    self.kirpeja_id = ""
    self.name = ""
    self.image = "nophoto.jpg"
    self.duration = ""
}
}

这里是我的 json 函数

final let jsonUrl = URL(string: "http://**********/getlaikas_new.php")
private var timeStatusResult = [TimeStatus]()

 func downloadJson () {
    guard let downloadURL = jsonUrl else {return}
    var request = URLRequest(url: downloadURL)
    request.setValue("application/x-www-form-urlencoded",forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
    let postString = "data=\(pInfo.paslaugosData!)&salonId=\(pInfo.ID!)&paslaugos_id=\(pInfo.paslaugosId!)"
    request.httpBody = postString.data(using: .utf8, allowLossyConversion: true)
    URLSession.shared.dataTask(with: request) {data, urlResponse, error in

        guard let data = data , error == nil, urlResponse != nil else {
            print ("something wrong")
            return }
        print ("downloaded!")
        do
        {
            let decoder = JSONDecoder()
            print (data)
            let downloadedTimeStatus = try decoder.decode(TimeStatusResult.self, from: data)

            self.timeStatusResult = downloadedTimeStatus.result

            DispatchQueue.main.async {
               // self.kirpejosPaslaugosTable.reloadData()
            }

        } catch {
            print ("something wrong after download")
        }
        }.resume()
}

在这一行我有问题

let downloadedTimeStatus = try decoder.decode(TimeStatusResult.self, from: data)

有人可以帮助我吗? :(

【问题讨论】:

  • 有什么问题?数据错误?碰撞?不会编译?
  • 行代码进入 catch 语句后,变量 deletedTimeStatus 为空
  • 为什么不在catch 子句中打印real 错误而不是无意义的文字字符串?
  • Swift.DecodingError.Context(codingPath: [burzua_1.TimeStatusResult.(CodingKeys in _479ABD1AF7892C9F2FD23EC23214E088).result, Foundation.(_JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue: "0Index 0," 。),burzua_1.TimeStatus(在_479ABD1AF7892C9F2FD23EC23214E088).STATUS CodingKeys,基金会(_ JSONKey在_12768CA107A31EF2DCE034FD75B541C9)(stringValue的: “索引0” 的intValue:可选(0)),burzua_1.Status(CodingKeys在_479ABD1AF7892C9F2FD23EC23214E088).STATUS] debugDescription:“应该解码字符串,但找到了一个数字。”,基础错误:nil))

标签: json swift4 codable


【解决方案1】:

错误很明显:

...burzua_1.Status.(CodingKeys in _479ABD1AF7892C9F2FD23EC23214E088).status], debugDescription: "预期解码字符串但找到了一个数字。"

status 的值是 not 在双引号中,所以它是 Int

class Status: Codable {
   let status: Int
   ...

请不要随意将所有属性声明为可选。例如status 以及所有其他键都存在于所有Status 字典中。

【讨论】:

  • 为我感到羞耻 :) tnx
猜你喜欢
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多