首页 文章

Swift:从JSON解析日期[关闭]

提问于
浏览
0

我在项目上工作,我必须从PHP服务器接收数据 . 一切都很好,只有两件事:1 . )无法解析Date . 我知道这个问题已在这里得到解答,但在我的案例中并没有其中一个变体 . 这是我的代码

import Foundation
import SwiftyJSON


func getClientDataFromServer(id: String?) {
    guard let id = id else {return}
    let jsonUrlString = "https://sverlim.software/cms/clientReadOneClient.php?client_id=10"
    let url = URL(string: jsonUrlString)!
    URLSession.shared.dataTask(with: url) { (data, response, err) in
        guard err == nil else {
            print(err!.localizedDescription)
            return
        }
        print(response as Any)
        guard let data = data else {return}
        let dateFormatterWithTime: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        formatter.timeZone = TimeZone(abbreviation: "UTC")
        formatter.locale = Locale(identifier: "en_US_POSIX")
        return formatter
        }()

        let datastring = String(data: data, encoding: .utf8)
        print("data====\(datastring!)")
        let json = try! JSONSerialization.jsonObject(with: data, options: []) as! [[String:Any]]
        print(json[0]["datarteg"] as Any)
        do {
            let decoder = JSONDecoder()

            let object = try! JSON(data: data)
            print(object[0]["datareg"].dateTime)
            print(object[0]["company"].stringValue)

            decoder.dateDecodingStrategy = .formatted(dateFormatterWithTime)
            let clients = try decoder.decode([Client].self, from: data)
            print(clients)
            let client = clients.first
            print(client!)
        } catch let jsonErr {
            print(jsonErr)
        }
        }.resume()
}
struct Client: Codable {
    let id: String?
    let name: String?
    let phone: String?
    let company: String?
    let discount: String?
    var datareg: Date?
}

class Formatter {
    static let jsonDateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }()

    static let jsonDateTimeFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy'-'MM'-'dd' 'HH':'mm':'ss"
        return formatter
    }()
}

extension JSON {

    public var date: Date? {
        get {
            switch self.type {
            case .string:
                return Formatter.jsonDateFormatter.date(from: self.object as! String)
            default:
                return nil
            }
        }
    }

    public var dateTime: Date? {
        get {
            switch self.type {
            case .string:
                return Formatter.jsonDateTimeFormatter.date(from: self.object as! String)
            default:
                return nil
            }
        }
}

我按照这个答案

Swift's JSONDecoder with multiple date formats in a JSON string?

How do I format JSON Date String with Swift?

https://useyourloaf.com/blog/swift-codable-with-custom-dates/

这是我从日志打印的内容

data====
 [{"id":"10","name":"\u0423\u043a\u0440\u0430\u0438\u043d\u0435\u0446 
 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","phone":"+38098497
 4673","company":"2","discount":"0","datereg":"2017-11-28 14:16:16"}]
 nil
 nil
 2
 [SashaApp.Client(id: Optional("10"), name: Optional("Украинец Александр"), 
 phone: Optional("+380984974673"), company: Optional("2"), discount: 
 Optional("0"), datareg: nil)]
 Client(id: Optional("10"), name: Optional("Украинец Александр"), phone: 
 Optional("+380984974673"), company: Optional("2"), discount: 
 Optional("0"), datareg: nil)

正如我们所看到的,数据包含“datareg”字段,但无论如何解析(JSONDecoder,JSONSerialization,SwiftyJSON),我都收到nil 2)SSL_ERROR_ZERO_RETURN(6)

任何帮助,伙计们都将不胜感激 . 谢谢))

2 回答

  • 0

    您的文字中有拼写错误:

    print(object[0]["datareg"].dateTime)
    

    应该

    print(object[0]["datereg"].dateTime)
    
  • 0

    解析JSON有两种方法 .

    Before Swift 4

    在Swift 4之前,你只能使用JSONSerialization Class(就像在你的例子中一样) . 此方法返回可以在Dictionary中强制转换的Any对象(类型取决于您接收的数据) .

    例如:

    if let dict = try? JSONSerialization.jsonObject(with: data, options: []) as! Dictionary<String,String>{
       do some stuff...
    }
    

    如果您有多种数据,则应使用此转换:

    if let dict = try? JSONSerialization.jsonObject(with: data, options: []) as! Dictionary<String,Any?>{
           do some stuff...
    }
    

    然后,您可以通过密钥访问字典中的所有数据并管理数据(如果使用Any,请记住在使用之前输入正确的数据) .

    这里有一些文档:https://developer.apple.com/documentation/foundation/jsonserialization

    After Swift 4

    使用Swift 4,引入了一个新类:JSONEncoder和JSONDecoder . 这太棒了,因为你可以创建你的模型,解析json,你会得到一个已填充所有字段的对象 . 注意你的模型必须实现协议Codable(或Encodable和Decodable) . 如果您的模型没有实现协议,您将收到错误 .

    这是一个例子:

    这是我的模特:

    class myClass: Codable{
        var Id: Int
        var Identifier: String
        var Alias: String
        var Revision: Int
        var Title: String
    }
    

    这是解析的代码:

    let decoder = JSONDecoder()
    
    let myClass = try! decoder.decode(Questionario.self, from: (json?.data(using: .utf8))!)
    

    现在我的变量“myClass”已经包含了json中填充数据的所有字段 .

    这里有一些文档:

    https://developer.apple.com/documentation/swift/codable

    https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types

相关问题