可编码和自定义字段解码



我使用可编码协议和JSONDecoder来解码我从Web服务中获得的JSON。而且效果非常好。不过,有一点是,我有时会得到不同格式的Date,所以我想为这个字段设置自定义解码。

浏览SO和网络,我发现这是可以做到的,但我也必须手动解码所有其他字段。由于我有很多字段,我想自动解码所有字段,然后只对这一个字段进行手动解码。

这可能吗?

编辑:

我会提供更多的信息,因为这个问题似乎引起了很多困惑。

我有一个JSON,它有很多字段。我的结构体Person采用了Codable。我使用像这个一样的JSON解码器

let person = try self.jsonDecoder.decode(Person.self, from: data)

现在,所有字段都自动设置为struct。但有时我有一个或多个字段,我想手动解码它们。在这种情况下,它只是日期,可以有各种格式。如果可能的话,我想使用同一条线路:

let person = try self.jsonDecoder.decode(Person.self, from: data)

其中所有其他字段将被自动解码,并且只有Date将具有手动编码。

您可以简单地将用于解码的JSONDecoderdateDecodingStrategy设置为formatted,并提供具有指定格式的DateFormatter,如果失败,则提供其他日期格式。查看完整的工作代码和示例:

struct VaryingDate: Decodable {
let a:String
let date:Date
}
let jsonWithFirstDate = "{"a":"first","date":"2019/01/09"}".data(using: .utf8)!
let jsonWithSecondDate = "{"a":"first","date":"2019-01-09T12:12:12"}".data(using: .utf8)!
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy/MM/dd"
let jsonDecoder = JSONDecoder()
jsonDecoder.dateDecodingStrategy = .formatted(dateFormatter)
do {
try jsonDecoder.decode(VaryingDate.self, from: jsonWithFirstDate) // succeeds
try jsonDecoder.decode(VaryingDate.self, from: jsonWithSecondDate) // fails, as expected
} catch {
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
try jsonDecoder.decode(VaryingDate.self, from: jsonWithSecondDate) // succeeds with the updated date format
}

相关内容

  • 没有找到相关文章

最新更新