Swift 4 Decodable - 没有与键 CodingKeys 关联的值[重复]

swift

1个回答

写回答

何潜龙

2025-07-09 16:55

+ 关注

Swift
Swift

使用 Swift 4 中的 Decodable 协议能够方便地将 JSON 数据解析为自定义的结构体或类。然而,有时候我们会遇到这样的情况:JSON 数据中的键与我们定义的属性名不一致。在这种情况下,我们可以通过使用 CodingKeys 枚举来映射 JSON 数据中的键与我们定义的属性名。然而,有时候我们可能会遇到一个问题:JSON 数据中的某个键没有与之对应的属性值。接下来我们将讨论这个问题,并提供解决方案。

Swift 4 中,我们可以通过编写符合 Decodable 协议的结构体或类来实现 JSON 解析。在这个结构体或类中,我们可以使用 CodingKeys 枚举来定义 JSON 数据中的键与我们定义的属性名之间的映射关系。例如,假设我们有一个包含用户信息的 JSON 数据,如下所示:

JSon

{

"name": "John Doe",

"age": 30,

"address": "123 MAIn Street"

}

我们可以定义一个 User 结构体,并使用 CodingKeys 枚举来定义键与属性名之间的映射关系,代码如下:

Swift

struct User: Decodable {

let name: String

let age: Int

let address: String

private enum CodingKeys: String, CodingKey {

case name

case age

case address

}

}

在上面的代码中,我们定义了一个 CodingKeys 枚举,并将 JSON 数据中的键与我们定义的属性名进行了映射。这样,在解析 JSON 数据时,Swift 就能够正确地将键值分配给相应的属性。

然而,有时候 JSON 数据中的某个键可能没有与之对应的属性值。例如,假设我们的 JSON 数据变为:

JSon

{

"name": "John Doe",

"age": 30

}

这个时候,我们的代码就会出现问题,因为 JSON 数据中的 "address" 键没有与之对应的属性值。如果我们尝试解析这个 JSON 数据,Swift 将会报错。

为了解决这个问题,我们可以在 CodingKeys 枚举中使用可选值来定义键与属性名之间的映射关系。代码如下:

Swift

struct User: Decodable {

let name: String

let age: Int

let address: String?

private enum CodingKeys: String, CodingKey {

case name

case age

case address = "address"

}

}

在上面的代码中,我们将 address 属性定义为可选类型,并在 CodingKeys 枚举中将 "address" 键与它进行了关联。这样,当解析 JSON 数据时,Swift 就会将 "address" 键的值分配给 address 属性,如果没有对应的值,Swift 将会将 address 属性设置为 nil。

解决没有与键 CodingKeys 关联的值的问题

当我们遇到 JSON 数据中的某个键没有与之对应的属性值时,我们可以使用可选类型来解决这个问题。通过将属性定义为可选类型,并在 CodingKeys 枚举中将键与属性名进行关联,我们可以确保在解析 JSON 数据时不会因为缺少某个属性值而出错。

一下,Swift 4 中的 Decodable 协议能够方便地将 JSON 数据解析为自定义的结构体或类。当 JSON 数据中的键与我们定义的属性名不一致时,我们可以通过使用 CodingKeys 枚举来映射这两者之间的关系。当 JSON 数据中的某个键没有与之对应的属性值时,我们可以使用可选类型来解决这个问题。这些技巧能够帮助我们更好地处理 JSON 解析过程中的各种情况,使我们的代码更加健壮和可靠。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号