在Swift 5.1中,我想解码一个包含名为self的元素的JSON文档。这是一个HAL文档,因此我无法更改元素名称。
JSON就是这样;
{ "_embedded": { "eventList": [ { "id": 1, "datetime": "2020-04-20T20:00:00", "description": "...", "_links": { "self": { "href": "http://.../events/1" } } }, { "id": 2, "datetime": "2020-04-19T08:30:00", "description": "...", "_links": { "self": { "href": "http://.../events/2" } } } ] }, "_links": { "self": { "href": "http://.../events" } } }
我的域模型如下所示
struct JSonRootElement: Codable { var _embedded: JsonEmbedded } struct JsonEmbedded: Codable { var eventList: [JsonEvent] } struct JsonEvent: Codable { var id: Int var datetime: String var description: String var _links: JsonHalLink } struct JsonHalLink: Codable { var self: JsonHalSelfLink } struct JsonHalSelfLink: Codable { var href: String }
当然,JsonHalLink结构包含一个禁止的名称。我可以重命名变量名称,但是如何告诉Swift它必须从JSON读取self元素?
您可以在受限关键字周围使用反引号(`),将其用作变量名。
struct JsonHalLink: Codable { let `self`: JsonHalSelfLink }
否则,如果您希望变量的名称不同于其JSON密钥,则可以声明一个CodingKey
一致性enum
来定义属性名称和JSON密钥之间的映射。
struct JsonHalLink: Codable { let varName: JsonHalSelfLink private enum CodingKeys: String, CodingKey { case varName = "self" } }
与您的问题无关,但仅应var
在实际需要将属性可变时才将其声明为mutable()。如果它们从未被突变,只需将它们声明为不可变(let
)。