使用 Swift Decodable 进行动态(但称为另一个键值)JSON 解码

代码库加号

我查看了类似问题的答案,我无法很好地理解codingKey,此外它并不完全适用于我的情况,因为密钥并非完全“未知”,它是前一个密钥的值。我的 API:

{
  "api": {
    "results": 1,
    "fixtures": [
      {
        "homeTeam": {
          "team_name": "Tottenham"
        },
        "awayTeam": {
          "team_name": "Everton"
        },
        "lineups": {
          "Tottenham": {
            "formation": "4-2-3-1"
          },
          "Everton": {
            "formation": "4-2-3-1"
          }
        }
      }
    ]
  }
}

我的代码:

class matchApiObject: Decodable
{
    let fixtures: [fixture]
    init (fixtures: [fixture])
    {
        self.fixtures = fixtures
    }
}

class fixture: Decodable
{
    let homeTeam: matchHomeTeamObject?
    let lineups: lineUpsObject?
    init (homeTeam: matchHomeTeamObject?, lineups: lineUpsObject?)
    {
        self.homeTeam = homeTeam
        self.lineups = lineups
    }
}

class matchHomeTeamObject: Decodable
{
    let team_name: String?
    init (team_name: String?)
    {
        self.team_name = team_name
    }
}

class lineUpsObject: Decodable
{
    struct homeLineUp: Decodable
    {
        let formation: String?
        init(formation: String?)
        {
            self.formation = formation
        }
    }
    struct awayLineUp: Decodable
    {
        let formation: String?
        init (formation: String?)
        {
            self.formation = formation
        }
    }
}

显然,lineups 对象的键不会是“homeLineUp”,而是按照 api 示例,homeTeam.team_name 的值。

所以我想象的解决方案是:

class lineUpsObject: Decodable
{
    struct homeTeam.team_name: Decodable
    {
        let formation: String?
        init(formation: String?)
        {
            self.formation = formation
        }
    }
    struct awayTeam.team_name: Decodable
    {
        let formation: String?
        init (formation: String?)
        {
            self.formation = formation
        }
    }
}

这是不可能的,我知道我必须为此使用编码键,但我不明白如何将键的名称声明为前一个键值的值我不明白什么是 stringValue: String 或 intValue: int do incodingkey answer do or how they apply here, 谢谢。

瓦迪安

一个简单的解决方案是解码lineups为字典,我以大写字母开头命名所有结构以符合命名约定。

init不需要方法

struct Root : Decodable {
    let api : API
}

struct API : Decodable {
    let results : Int
    let fixtures : [Fixture]
}

struct Fixture : Decodable {
    let homeTeam, awayTeam: Team
    let lineups : [String:Lineup]
}

struct Team  : Decodable {
    let teamName : String
}

struct Lineup : Decodable {
    let formation : String
}

要将snake_cased转换camelCased结构成员,请添加适当的策略

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase

更复杂的解决方案是将formation数据放入Team结构中,但这需要init(from decoder:)Fixture.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

快速使用Decodable提取和解码json数据

来自分类Dev

在Swift中使用Decodable解析嵌套的JSON

来自分类Dev

使用 Decodable for JSON 时出错 - Swift

来自分类Dev

如果首次解码失败,则使用Combine和Swift解码另一个响应

来自分类Dev

使用 swift 的 Codable 解码 JSON

来自分类Dev

使用Decodable解码基本JSON响应的对象类型和通用类型的数据

来自分类Dev

使用 swift 4 进行 JSON 编码/解码

来自分类Dev

使用 Swift Decodable 解析任意格式的 JSON 日期

来自分类Dev

对于从可解码兼容类派生的类(JSONDecoder 用于解码),Swift Decodable 失败

来自分类Dev

解码嵌套的 JSON Swift

来自分类Dev

如何使用 Swift 解码 HTML?

来自分类Dev

使用 Swift 4 Decodable 将字符串 JSON 响应转换为布尔值

来自分类Dev

使用 Swift 4 Decodable 的 JSON/简单文本解析服务器响应

来自分类Dev

如何使用Circe进行动态解码?

来自分类Dev

在 Swift 4 中,如何使用 Codable 解码 JSON 并在解码的对象之间创建引用?

来自分类Dev

使用来自 JSON swift4 的密钥解码结构

来自分类Dev

如何在通用函数中使用Swift通用Decodable协议

来自分类Dev

Swift 5:解码嵌套JSON

来自分类Dev

如何从openFoodFacts JSON(Swift)解码

来自分类Dev

Swift4 / JSON / 解码

来自分类Dev

Swift 4 解码从 JSON 翻倍

来自分类Dev

如何使用json解码

来自分类Dev

Swift 4 - 如何构造一个 json 对象并在 switch 中使用可解码(不工作)

来自分类Dev

在Swift中使用特殊字符解码URL

来自分类Dev

使用PHP进行JSON解码

来自分类Dev

从 SWIFT 中的 url 进行 JSON 解码

来自分类Dev

JSON中的数组未使用Swift中的自定义解码功能进行解析

来自分类Dev

如何使用 JSONDecoder 和 Swift 4 Decodabale 类对此进行解码

来自分类Dev

如何在Swift中使用Codable解码具有不同对象的JSON数组?

Related 相关文章

  1. 1

    快速使用Decodable提取和解码json数据

  2. 2

    在Swift中使用Decodable解析嵌套的JSON

  3. 3

    使用 Decodable for JSON 时出错 - Swift

  4. 4

    如果首次解码失败,则使用Combine和Swift解码另一个响应

  5. 5

    使用 swift 的 Codable 解码 JSON

  6. 6

    使用Decodable解码基本JSON响应的对象类型和通用类型的数据

  7. 7

    使用 swift 4 进行 JSON 编码/解码

  8. 8

    使用 Swift Decodable 解析任意格式的 JSON 日期

  9. 9

    对于从可解码兼容类派生的类(JSONDecoder 用于解码),Swift Decodable 失败

  10. 10

    解码嵌套的 JSON Swift

  11. 11

    如何使用 Swift 解码 HTML?

  12. 12

    使用 Swift 4 Decodable 将字符串 JSON 响应转换为布尔值

  13. 13

    使用 Swift 4 Decodable 的 JSON/简单文本解析服务器响应

  14. 14

    如何使用Circe进行动态解码?

  15. 15

    在 Swift 4 中,如何使用 Codable 解码 JSON 并在解码的对象之间创建引用?

  16. 16

    使用来自 JSON swift4 的密钥解码结构

  17. 17

    如何在通用函数中使用Swift通用Decodable协议

  18. 18

    Swift 5:解码嵌套JSON

  19. 19

    如何从openFoodFacts JSON(Swift)解码

  20. 20

    Swift4 / JSON / 解码

  21. 21

    Swift 4 解码从 JSON 翻倍

  22. 22

    如何使用json解码

  23. 23

    Swift 4 - 如何构造一个 json 对象并在 switch 中使用可解码(不工作)

  24. 24

    在Swift中使用特殊字符解码URL

  25. 25

    使用PHP进行JSON解码

  26. 26

    从 SWIFT 中的 url 进行 JSON 解码

  27. 27

    JSON中的数组未使用Swift中的自定义解码功能进行解析

  28. 28

    如何使用 JSONDecoder 和 Swift 4 Decodabale 类对此进行解码

  29. 29

    如何在Swift中使用Codable解码具有不同对象的JSON数组?

热门标签

归档