【问题标题】:Decoding JSON with element named self使用名为 self 的元素解码 JSON
【发布时间】:2019-11-13 17:17:11
【问题描述】:

在 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 元素?

【问题讨论】:

    标签: json swift codable


    【解决方案1】:

    您可以在受限关键字周围使用反引号 (`) 将它们用作变量名。

    struct JsonHalLink: Codable {
        let `self`: JsonHalSelfLink
    }
    

    否则,如果您希望变量具有与其 JSON 键不同的名称,则可以声明符合 CodingKeyenum 来定义属性名称和 JSON 键之间的映射。

    struct JsonHalLink: Codable {
        let varName: JsonHalSelfLink
    
        private enum CodingKeys: String, CodingKey {
            case varName = "self"
        }
    }
    

    与您的问题无关,但您应该仅在属性实际需要可变时将其声明为可变 (var)。如果它们从未发生变异,只需将它们声明为不可变 (let)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 2021-01-24
      • 2015-10-14
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多