簡體   English   中英

從JSON Swift創建結構或對象數組

[英]Create an array of struct or object from json swift

我有一個用供應商列表填充的JSON。 什么是最好的和最有效的方法來將其作為實例,這些實例可以在類中輕松訪問並可以在項目中傳遞。 我正在考慮使用struct,因為我以前從未使用過它們。 比使用對象好嗎?

下面我有我的結構。

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))
}

}

我的問題是如何從此結構類型的JSON創建數組。

謝謝

是的,使用struct是封裝數據的好方法。 只要該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)]
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM