ios - 使用 Codable 将空字符串解码为 nil
问题描述
正常情况:
{
"maintenance": true
}
{
"maintenance": false
}
如果没有维修站,就会变成empty string
{
"maintenance": ""
}
nil
如果维护是json中的空字符串,我想拥有
struct Demo: Codable {
var maintenance: Bool?
}
有什么好的方法吗?
解决方案
您需要尝试解码 Bool,捕获错误,尝试解码字符串并检查它是否为空字符串,否则抛出错误。这将确保您不会丢弃任何解码错误,即使它是一个字符串但不是空的:
struct Demo: Codable {
var maintenance: Bool?
}
struct Root: Codable {
var maintenance: Bool?
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
do {
maintenance = try container.decode(Bool.self, forKey: .maintenance)
} catch {
guard try container.decode(String.self, forKey: .maintenance) == "" else {
throw error
}
maintenance = nil
}
}
}
游乐场测试:
let json1 = """
{
"maintenance": true
}
"""
let json2 = """
{
"maintenance": false
}
"""
let json3 = """
{
"maintenance": ""
}
"""
let json4 = """
{
"maintenance": "false"
}
"""
do {
let root1 = try JSONDecoder().decode(Root.self, from: Data(json1.utf8))
print("root1", root1)
} catch {
print(error)
}
do {
let root2 = try JSONDecoder().decode(Root.self, from: Data(json2.utf8))
print("root2", root2)
} catch {
print(error)
}
do {
let root3 = try JSONDecoder().decode(Root.self, from: Data(json3.utf8))
print("root3", root3)
} catch {
print(error)
}
do {
let root4 = try JSONDecoder().decode(Root.self, from: Data(json4.utf8))
print("root4", root4)
} catch {
print(error)
}
这将打印
root1 根(维护:可选(true))
root2 根(维护:可选(假))
root3 根(维护:nil)
typeMismatch(Swift.Bool,Swift.DecodingError.Context(codingPath:[CodingKeys(stringValue:“维护”, intValue: nil)], debugDescription: "预期解码 Bool 但找到了一个字符串/数据。",底层错误: nil))
推荐阅读
- sql - 如何将数字转换为字符串,提取每个数字,再次将其转换为整数,然后在 SQL 中将它们加在一起(例如 1+2+3+4+5+6)?
- r - 根据属性过滤数据(data.frame)并将其分配给向量
- xamarin.forms - Xamarin Forms:在 TimePicker 中关闭时钟弹出后,UI 上显示的时间不同?
- apache-flink - 当我将 jar 提交给 Flink 时的 NPE
- python - 编写一个函数,将一个矩阵和一个标量乘数作为输入,并返回一个包含标量和矩阵的标量积的新矩阵
- reactjs - 从图像 ReactJs 中去除所有 EXIF 和其他元数据
- excel - 将下拉选项组织到不同的 Excel 表格中
- java - 从 Firebase 导入数据不会出现在文本视图中
- html - 引导如何将内容与导航栏对齐
- javascript - 在ajax调用后获取Checkboxfor选中的值不起作用