当前位置: 首页 > 面试题库 >

使用Swift 4中的JSONDecoder时,丢失的键可以使用默认值而不是必须是可选属性吗?

柳胡媚
2023-03-14
问题内容

Swift
4添加了新Codable协议。当我使用JSONDecoder它时,似乎要求类的所有非可选属性Codable在JSON中具有键,否则会引发错误。

使类的每个属性都是可选的似乎是不必要的麻烦,因为我真正想要的是使用json中的值或默认值。(我不希望该属性为零。)

有没有办法做到这一点?

class MyCodable: Codable {
    var name: String = "Default Appleseed"
}

func load(input: String) {
    do {
        if let data = input.data(using: .utf8) {
            let result = try JSONDecoder().decode(MyCodable.self, from: data)
            print("name: \(result.name)")
        }
    } catch  {
        print("error: \(error)")
        // `Error message: "Key not found when expecting non-optional type
        // String for coding key \"name\""`
    }
}

let goodInput = "{\"name\": \"Jonny Appleseed\" }"
let badInput = "{}"
load(input: goodInput) // works, `name` is Jonny Applessed
load(input: badInput) // breaks, `name` required since property is non-optional

问题答案:

我更喜欢的方法是使用所谓的DTO-数据传输对象。它是一个结构,符合Codable并表示所需的对象。

struct MyClassDTO: Codable {
    let items: [String]?
    let otherVar: Int?
}

然后,您只需使用该DTO初始化要在应用程序中使用的对象。

 class MyClass {
    let items: [String]
    var otherVar = 3
    init(_ dto: MyClassDTO) {
        items = dto.items ?? [String]()
        otherVar = dto.otherVar ?? 3
    }

    var dto: MyClassDTO {
        return MyClassDTO(items: items, otherVar: otherVar)
    }
}

这种方法也是不错的选择,因为您可以按自己的意愿重命名和更改最终对象。很明显,比手动解码需要更少的代码。此外,通过这种方法,您可以将网络层与其他应用程序分开。



 类似资料:
  • Swift 4 添加了新的 协议。当我使用时,它似乎要求我的类的所有非可选属性在JSON中具有键,否则会引发错误。 使我的类的每个属性都是可选的似乎是一个不必要的麻烦,因为我真正想要的是使用json中的值或默认值。(我不希望属性为零。 有没有办法做到这一点?

  • 在使用Jackson反序列化Json时,当Json文件中缺少属性时,是否有方法指定默认值

  • 指定:这就是表的样子。 希望得到的结果是由Hibernate为我构建的SQL查询:

  • 如果我用MockBean替换Autowired的话,它是有效的,但我不知道为什么

  • 如果属性值可以设置为 null,则其被认为是可选的(可空的)。相反,如果属性值设置为 null 是非法的,那么它就被认为是必须的属性。 惯例 按照惯例,值可以是 null 的运行时类型(string、int?、byte[] 等等)属性将被配置为可选。值不能为 null 的运行时类型(int、decimal、bool 等等)属性则将被配置为必须。 注意 值不能为 null 的运行时类型属性是无法被配

  • 问题内容: 我将 .properties 文件中的属性注入到 @Value 注释的字段中。但是,此属性提供敏感的凭据,因此我将它们从存储库中删除。我仍然希望在某些情况下想要运行项目并且没有带有默认值将设置为字段的凭据的.properties文件。 问题 即使我将默认值设置为字段本身,当.properties文件不存在时,也会出现异常: 这是带注释的字段: 我希望在这种情况下只设置普通的字符串“ s