JSONDecoder具有多种日期格式?

问题描述

我有2种来自api的日期。我需要一起解码。但是我没有找到任何解决方案。我需要在此代码添加"yyyy-MM-dd'T'HH:mm:ssZ"格式。我该怎么办?

    func run<T: Decodable>(_ request: URLRequest,_ decoder: JSONDecoder = JSONDecoder()) -> AnyPublisher<Response<T>,Error> {
    return URLSession.shared
        .dataTaskPublisher(for: request)
        .receive(on: dispatchQueue.main)
        .tryMap { result -> Response<T> in
            self.dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
            decoder.dateDecodingStrategy = .formatted(self.dateFormatter)
            let value = try decoder.decode(T.self,from: result.data)
            return Response(value: value,response: result.response)
        }
        .erasetoAnyPublisher()
}

解决方法

另一种方法是使用自定义dateDecodingStrategyISO8601DateFormatter,它可以根据给定的字符串指定日期格式

func run<T: Decodable>(_ request: URLRequest,_ decoder: JSONDecoder = JSONDecoder()) -> AnyPublisher<Response<T>,Error> {
return URLSession.shared
    .dataTaskPublisher(for: request)
    .receive(on: DispatchQueue.main)
    .tryMap { result -> Response<T> in
        decoder.dateDecodingStrategy = .custom { decoder -> Date in
            let container = try decoder.singleValueContainer()
            let dateFormatter = ISO8601DateFormatter()
            let dateString = try container.decode(String.self)
            if !dateString.hasSuffix("Z") {                            
                dateFormatter.formatOptions.remove(.withTimeZone) 
            }
            if let isoDate = dateFormatter.date(from: dateString) {
                return isoDate 
            } else {
                throw DecodingError.dataCorruptedError(in: container,debugDescription: "Wrong Date Format")
            }
        }
        let value = try decoder.decode(T.self,from: result.data)
        return Response(value: value,response: result.response)
    }
    .eraseToAnyPublisher()
}
,

您可以通过实现init(from decoder: Decoder)

来实现自定义解码行为

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