我有一个 JSON 填充了供应商列表。将其作为可在类中轻松访问并可通过项目传递的实例的最佳和最有效方法是什么。我正在考虑使用 struct ,因为我以前没有使用过它们。它比使用 Object 更好吗?
下面我有我的结构。
struct Vendor {
let name: String
let latitude: Double
let longitude: Double
init(dictionary: [String: Any]) {
self.name = dictionary["name"] as? String ?? ""
self.latitude = dictionary["Lat"] as? Double ?? 0.0
self.longitude = dictionary["Lng"] as? Double ?? 0.0
}
init?(data: Data) {
guard let json = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any] else { return nil }
self.init(dictionary: json)
}
init?(json: String) {
self.init(data: Data(json.utf8))
}
Run Code Online (Sandbox Code Playgroud)
}
我的问题是如何从这种结构类型的 JSON 创建一个数组。
谢谢
小智 5
是的,使用 astruct是封装数据的好方法。只要struct您的 JSON 模型准确,您就可以轻松地在 JSON 之间进行转换。
如果您符合您的标准struct,Codable那么编码和解码为 JSON 就相当简单:
import Foundation
// Conform to Codable
struct Vendor: Codable {
let name: String
let latitude: Double
let longitude: Double
}
// create Array
var vendors = [Vendor]()
for i in 1...3 {
let vendor = Vendor(name: "Foo", latitude: Double(i), longitude: 20.0)
vendors.append(vendor)
}
// encode the Array into a JSON string
// convert to Data, then convert to String
if let jsonData = try? JSONEncoder().encode(vendors),
let jsonString = String(data: jsonData, encoding: .utf8) {
print(jsonString)
// [{"name":"Foo","longitude":20,"latitude":1},{"name":"Foo","longitude":20,"latitude":2},{"name":"Foo","longitude":20,"latitude":3}]
// decode the JSON string back into an Array
// convert to Data, then convert to [Vendor]
if let vendorData = jsonString.data(using: .utf8),
let vendorArray = try? JSONDecoder().decode([Vendor].self, from: vendorData) {
print(vendorArray)
// [__lldb_expr_8.Vendor(name: "Foo", latitude: 1.0, longitude: 20.0), __lldb_expr_8.Vendor(name: "Foo", latitude: 2.0, longitude: 20.0), __lldb_expr_8.Vendor(name: "Foo", latitude: 3.0, longitude: 20.0)]
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2327 次 |
| 最近记录: |