使用名为self的元素解码JSON

使用名为self的元素解码JSON,json,swift,codable,Json,Swift,Codable,在Swift 5.1中,我想解码一个JSON文档,其中包含一个名为self的元素。它是一个HAL文档,因此我无法更改元素名称 JSON是这样的 { "_embedded": { "eventList": [ { "id": 1, "datetime": "2020-04-20T20:00:00", "description": "...", "_links": { "self": {

在Swift 5.1中,我想解码一个JSON文档,其中包含一个名为self的元素。它是一个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键不同,可以声明符合的
encoment
enum
来定义属性名称和JSON键之间的映射

struct JsonHalLink: Codable {
    let varName: JsonHalSelfLink

    private enum CodingKeys: String, CodingKey {
        case varName = "self"
    }
}
与您的问题无关,但您应该仅在属性实际需要可变时将其声明为可变(
var
)。如果它们从未发生过变异,只需将它们声明为不可变(
let