Baby

从 JSON 文件创建模型,即使是 Baby 也能做到。

描述

Baby 可以从 json 中推断属性的类型,例如 StringIntDoubleURLDate

Baby 可以处理嵌套的 json,它将生成嵌套的模型。

Baby 支持 Swift 4 的 Codable

示例

JSON

{
    "id": 42,
    "name": "nixzhu",
    "twitter": {
        "profile_url": "https://twitter.com/nixzhu",
        "created_at": "2009-05-12T10:25:43.511Z"
    }
}

带有 Codable 的 Swift 代码

struct User: Codable {
    let id: Int
    let name: String
    struct Twitter: Codable {
        let profileURL: URL
        let createdAt: Date
        private enum CodingKeys: String, CodingKey {
            case profileURL = "profile_url"
            case createdAt = "created_at"
        }
    }
    let twitter: Twitter
}

请注意,这里使用了属性映射 profile_url: profileURL 来更改属性名称(自动生成的将是 profileUrl)。

不带 Codable 的 Swift 代码

struct User {
    let id: Int
    let name: String
    struct Twitter {
        let profileURL: URL
        let createdAt: Date
        init(profileURL: URL, createdAt: Date) {
            self.profileURL = profileURL
            self.createdAt = createdAt
        }
        init?(json: [String: Any]) {
            guard let profileURLString = json["profile_url"] as? String else { return nil }
            guard let profileURL = URL(string: profileURLString) else { return nil }
            guard let createdAtString = json["created_at"] as? String else { return nil }
            guard let createdAt = DateFormatter.iso8601.date(from: createdAtString) else { return nil }
            self.init(profileURL: profileURL, createdAt: createdAt)
        }
    }
    let twitter: Twitter
    init(id: Int, name: String, twitter: Twitter) {
        self.id = id
        self.name = name
        self.twitter = twitter
    }
    init?(json: [String: Any]) {
        guard let id = json["id"] as? Int else { return nil }
        guard let name = json["name"] as? String else { return nil }
        guard let twitterJSONDictionary = json["twitter"] as? [String: Any] else { return nil }
        guard let twitter = Twitter(json: twitterJSONDictionary) else { return nil }
        self.init(id: id, name: name, twitter: twitter)
    }
}

您可能需要一个 DateFormatter 扩展

extension DateFormatter {

    static let iso8601: DateFormatter = {
        let formatter = DateFormatter()
        formatter.timeZone = TimeZone(abbreviation: "UTC")
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ"
        return formatter
    }()
}

Baby 也可以处理数组根 json,它将自动合并数组中对象的属性。

安装

构建

$ bash install.sh

运行

$ baby -i JSONFilePath

帮助

$ baby --help

如果您喜欢,请尝试 Baby 的 Web 界面 SharedBaby

在 Mac App Store 获取 Ducky

联系方式

您可以在 Twitter 上找到我。

许可证

MIT