首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift Json将嵌套数组/字典解码为平面模型

Swift Json将嵌套数组/字典解码为平面模型
EN

Stack Overflow用户
提问于 2021-01-30 05:04:28
回答 1查看 197关注 0票数 0

我正在尝试将下面的json对象解码为我在Swift中的User模型。

我的问题是将值_idtoken解码出tokens数组,其中数组中的第一个标记包含要解码为User.tokenId和User.token的值。

我试图将值直接提取/映射到我的用户模型结构中,而不是在我的用户模型中有另一个嵌套结构(比如struct Token { var id: String , var token: String } )。

代码语言:javascript
运行
复制
let json = """
    {
        "currentLocation": {
            "latitude": 0,
            "longitude": 0
        },
        "profileImageUrl": "",
        "bio": "",
        "_id": "601453e4aae564fc19075b68",
        "username": "johnsmith",
        "name": "john",
        "email": "johnsmith@gmail.com",
        "keywords": ["word", "weds"],
        "tokens": [
            {
                "_id": "213453e4aae564fcqu775b69",
                "token": "eyJhbGciOiJIUzqoNiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MDE0NTNlNGFhZTU2NGZjMTkwNzViNjgiLCJpYXQiOjE2MTE5NDQ5MzIsImV4cCI6MTYxMjM3NjkzMn0.PbTsA3B0MAfcVvEF1UAMhUXFiqIL1FcxVFGgMTZ5HCk"
            }
        ],
        "createdAt": "2021-01-29T18:28:52.845Z",
        "updatedAt": "2021-01-29T18:28:52.883Z"
    }
    """.data(using: .utf8)!


struct User: Codable {
    var latitude: Double 
    var longitude: Double 
    var profileImageUrl: String 
    var bio: String 
    var userId: String 
    var username: String
    var name: String
    var email: String
    var keywords: [String]
    var tokenId: String
    var token: String
    var createdAt: Date
    var updatedAt: Date
    
    private enum UserKeys: String, CodingKey {
        case currentLocation
        case profileImageUrl
        case bio
        case userId = "_id"
        case username
        case name
        case email
        case keywords
        case tokens
        case createdAt
        case updatedAt
    }
    
    private enum CurrentLocationKeys: String, CodingKey { 
        case latitude
        case longitude
    }
    
    private enum TokenKeys: String, CodingKey {
        case tokenId = "_id"
        case token
    }
    
    init(from decoder: Decoder) throws {
        
        let userContainer = try decoder.container(keyedBy: UserKeys.self)
              let currentLocationContainer = try userContainer.nestedContainer(keyedBy: CurrentLocationKeys.self, forKey: .currentLocation) 
              self.latitude = try currentLocationContainer.decode(Double.self, forKey: .latitude)
              self.longitude = try currentLocationContainer.decode(Double.self, forKey: .longitude)
            self.profileImageUrl = try userContainer.decode(String.self, forKey: .profileImageUrl)
            self.bio = try userContainer.decode(String.self, forKey: .bio)
            self.userId = try userContainer.decode(String.self, forKey: .userId)
            self.username = try userContainer.decode(String.self, forKey: .username)
            self.name = try userContainer.decode(String.self, forKey: .name)
            self.email = try userContainer.decode(String.self, forKey: .email)
            self.keywords = try userContainer.decode([String].self, forKey: .keywords)
              let tokensContainer = try userContainer.nestedContainer(keyedBy: TokenKeys.self, forKey: .tokens)
              self.tokenId = try tokensContainer.decode(String.self, forKey: .tokenId)
              self.token = try tokensContainer.decode(String.self, forKey: .token)
            self.createdAt = try userContainer.decode(Date.self, forKey: .createdAt)
            self.updatedAt = try userContainer.decode(Date.self, forKey: .updatedAt)
    }
}

let user = try! decoder.decode(User.self, from: json)
EN

回答 1

Stack Overflow用户

发布于 2021-01-30 05:18:07

首先,我假设您的decoder具有适当的日期解码策略,以便能够将ISO8601字符串解码为Date

token字典的封闭容器是一个数组。您必须插入一个中间nestedUnkeyedContainer

代码语言:javascript
运行
复制
...
var arrayContainer = try userContainer.nestedUnkeyedContainer(forKey: .tokens)
let tokensContainer = try arrayContainer.nestedContainer(keyedBy: TokenKeys.self)
self.tokenId = try tokensContainer.decode(String.self, forKey: .tokenId)
self.token = try tokensContainer.decode(String.self, forKey: .token)
...

将JSON解码为多个结构所需的代码要少得多

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65961704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档