在 Swift 中解码不同类型的 JSON 数组

The*_*rF8 3 json swift decodable

我正在尝试解码以下 JSON 对象

{
    "result":[
             {
             "rank":12,
             "user":{ 
                     "name":"bob","age":12 
                    } 
             }, 
             {
             "1":[ 
                  {
                    "name":"bob","age":12
                  },
                  {
                   "name":"tim","age":13
                  }, 
                  {
                   "name":"tony","age":12
                  }, 
                  {
                   "name":"greg","age":13
                  } 
                 ] 
            } 
           ] 
}
Run Code Online (Sandbox Code Playgroud)

struct userObject { var name: String var age: Int }

基本上是一个具有两种不同对象类型的 JSON 数组

{ "rank":12, "user": {userObject} }
Run Code Online (Sandbox Code Playgroud)

和一个“1”:数组 [userObjects]

struct data: Decodable {
   rank: Int
   user: user
   1:    [user]  <-- this is one area Im stuck
}
Run Code Online (Sandbox Code Playgroud)

提前致谢

vad*_*ian 8

只是为了好玩:

首先,您需要用户的结构以及result数组中第一个和第二个字典的表示。键"1"被映射到one

struct User : Decodable {
    let name : String
    let age : Int
}

struct FirstDictionary : Decodable {
    let rank : Int
    let user : User
}

struct SecondDictionary : Decodable {
    let one : [User]

    private enum CodingKeys: String, CodingKey { case one = "1" }
}
Run Code Online (Sandbox Code Playgroud)

现在是棘手的部分:

  • 首先获取根容器。
  • 获取容器resultasnestedUnkeyedContainer因为对象是一个数组。
  • 解码第一个字典并复制值。
  • 解码第二个字典并复制值。

    struct UserData: Decodable {
    
        let rank : Int
        let user : User
        let oneUsers : [User]
    
       private enum CodingKeys: String, CodingKey { case result }
    
        init(from decoder: Decoder) throws {
            let container = try decoder.container(keyedBy: CodingKeys.self)
            var arrayContainer = try container.nestedUnkeyedContainer(forKey: .result)
            let firstDictionary = try arrayContainer.decode(FirstDictionary.self)
            rank = firstDictionary.rank
            user = firstDictionary.user
            let secondDictionary = try arrayContainer.decode(SecondDictionary.self)
            oneUsers = secondDictionary.one
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

如果此代码优于传统手册, JSONSerialization则是另一个问题。