从 JSON 文件创建模型,即使是 Baby 也能做到。
Baby 可以从 json 中推断属性的类型,例如 String
、Int
、Double
、URL
和 Date
。
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