在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元素?
答案 0 :(得分:6)
您可以在受限关键字周围使用反引号(`),将其用作变量名。
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
)。如果它们从未被突变,只需将它们声明为不可变(let
)。