从内部具有用户对象的json解析用户(带有Codable)

时间:2019-05-23 16:47:42

标签: json swift codable

假设我有以下User对象:

struct User: Codable {
    let id: Int
}

并从API获取以下json:

{
    "user": {
        "id": "22"
    }
}

很明显,可编码用户不会解析。除了创建包装对象之外,还有其他方法吗?谢谢。

编辑:我对包装器有一些答案-我知道这种方法,但是我对替代方法感到好奇。

3 个答案:

答案 0 :(得分:2)

两个错误:缺少根对象,并且v-on:logout="do_logout_method()" v-on:login="do_login_method()" 的类型为id(请注意双引号)。

使用String,您必须始终从顶部解析JSON

Codable

或者解码为字典,但这使得struct Root : Codable { let user : User } struct User : Codable { let id: String } 的使用毫无意义。

答案 1 :(得分:2)

您可以在containers中使用 Codable 来获取nested data from JSON

容器=不需要包装对象

struct User: Decodable {
    var id: Int

    enum CodingKeys: String, CodingKey {
        case user, id
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        let user = try values.nestedContainer(keyedBy: CodingKeys.self, forKey: .user)
        let idStr = try user.decode(String.self, forKey: .id)
         id = Int(idStr) ?? 0
    }
}

使用containers,您可以使用id存储single object的值,而不用创建任何wrapper object

注意:在JSON示例中,您提供的id类型为String。但是在struct定义中,您使用的是id类型的Int。我给出的代码是在转换String to Int之后。如果您有错字,请按原样使用string值。

建议-将id用作Int?,而不是Int。最好不要存储任何值,而不要存储垃圾值(例如,本例中为0)

答案 2 :(得分:0)

最简单的JSON模型:

import Foundation

// MARK: - UserModel
struct UserModel: Codable {
let user: User
}

// MARK: - User
struct User: Codable {
let id: String
}