如何从json对象初始化结构 [英] How to initialize a struct from a json object
问题描述
我是新手,想尽办法.如何从json对象初始化结构.我不知道该怎么办.
HI i am new to swift any idea . How to initialize a struct from a json object . i could not figure out how can i do it .
{ 用户":{ "name":"cruskuaka", 电子邮件":"cristlika@gmail.com", "phoneNo":"018833455" }, 地址": { "house":"100", 街道":"B", 镇": { "town_id":"1", "town_name":高威市中心" }, 城市": { "city_id":"10", "city_name":高威" }, "address_id":"200", "full_address":"Galway,戈尔韦市中心B,100" }, "delivery_instruction":无人接听", "delivery_method":"1" }
{ "user": { "name": "cruskuaka", "email": "cristlika@gmail.com", "phoneNo":"018833455" }, "address": { "house": "100", "street": "B", "town": { "town_id": "1", "town_name": "Galway city center" }, "city": { "city_id": "10", "city_name": "Galway" }, "address_id":"200", "full_address":"100, B, Galway city center,Galway" }, "delivery_instruction": "no call", "delivery_method": "1" }
所有结构 :
Here all struct :
struct Contact {
let user : User
let address : Address
let deliveryInstruction : String
let deliveryMethod : String
init(dictionary: [String: Any]) {
self.deliveryInstruction = dictionary["delivery_instruction"] as? String ?? ""
self.deliveryMethod = dictionary["delivery_method"] as? String ?? ""
self.address = Address(dictionary: dictionary["address"] as? [String:Any] ?? [:])
self.user = User(dictionary: dictionary["address"] as? [String:Any] ?? [:])
}
}
struct User {
let name : String
let email : String
let phoneNo : String
init(dictionary : [String:Any] ) {
self.name = dictionary["name"] as? String ?? ""
self.email = dictionary["email"] as? String ?? ""
self.phoneNo = dictionary["phoneNo"] as? String ?? ""
}
}
struct Address {
let city : City
let town : Town
let addressId : String
let fullAddress : String
let house : String
let street: String
init(dictionary : [String:Any] ) {
self.addressId = dictionary["address_id"] as? String ?? ""
self.fullAddress = dictionary["full_address"] as? String ?? ""
self.house = dictionary["house"] as? String ?? ""
self.street = dictionary["street"] as? String ?? ""
self.city = City(dictionary: dictionary["address"] as? [String:Any] ?? [:])
self.town = Town(dictionary: dictionary["address"] as? [String:Any] ?? [:])
}
}
struct City {
let cityId : String
let cityName : String
init(dictionary : [String:Any] ) {
self.cityId = dictionary["city_id"] as? String ?? ""
self.cityName = dictionary["city_name"] as? String ?? ""
}
}
struct Town {
let townId : String
let townName : String
init(dictionary : [String:Any]) {
self.townId = dictionary["town_id"] as? String ?? ""
self.townName = dictionary["town_name"] as? String ?? ""
}
}
推荐答案
您的代码中有多个错误,但是您使用的是正确的路径.初始化用户,城市和城镇结构时,您使用了错误的密钥.我还创建了另外两个初始化程序,因此您可以使用字典,json字符串或仅其数据来初始化结构:
You have more than one error in your code, but you are in the right path. You are using the wrong key when initializing your user, city and town structs. I have also created two more initializers so you can initialize your struct with a dictionary, the json string or just its data:
struct Contact: CustomStringConvertible {
let user: User
let address: Address
let deliveryInstruction: String
let deliveryMethod: String
// customize the description to your needs
var description: String { return "\(user.name) \(deliveryInstruction) \(deliveryMethod)" }
init(dictionary: [String: Any]) {
self.deliveryInstruction = dictionary["delivery_instruction"] as? String ?? ""
self.deliveryMethod = dictionary["delivery_method"] as? String ?? ""
self.address = Address(dictionary: dictionary["address"] as? [String: Any] ?? [:])
self.user = User(dictionary: dictionary["user"] as? [String: Any] ?? [:])
}
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))
}
}
struct User: CustomStringConvertible {
let name: String
let email: String
let phone: String
let description: String
init(dictionary: [String: Any]) {
self.name = dictionary["name"] as? String ?? ""
self.email = dictionary["email"] as? String ?? ""
self.phone = dictionary["phoneNo"] as? String ?? ""
self.description = "name: \(name) - email: \(email) - phone: \(phone)"
}
}
struct Address: CustomStringConvertible {
let id: String
let street: String
let house: String
let city: City
let town: Town
let description: String
init(dictionary: [String: Any] ) {
self.id = dictionary["address_id"] as? String ?? ""
self.description = dictionary["full_address"] as? String ?? ""
self.house = dictionary["house"] as? String ?? ""
self.street = dictionary["street"] as? String ?? ""
self.city = City(dictionary: dictionary["city"] as? [String: Any] ?? [:])
self.town = Town(dictionary: dictionary["town"] as? [String: Any] ?? [:])
}
}
struct City: CustomStringConvertible {
let id: String
let name: String
// customize the description to your needs
var description: String { return name }
init(dictionary: [String: Any] ) {
self.id = dictionary["city_id"] as? String ?? ""
self.name = dictionary["city_name"] as? String ?? ""
}
}
struct Town: CustomStringConvertible {
let id: String
let name: String
// customize the description to your needs
var description: String { return name }
init(dictionary: [String: Any]) {
self.id = dictionary["town_id"] as? String ?? ""
self.name = dictionary["town_name"] as? String ?? ""
}
}
从JSON测试初始化:
Testing the initialization from JSON:
let json = "{\"user\": {\"name\": \"crst\",\"email\": \"crat@gmail.com\",\"phoneNo\":\"018833455\"},\"address\": {\"house\": \"100\",\"street\": \"B\",\"town\":{\"town_id\": \"1\",\"town_name\": \"Galway city center\"},\"city\":{\"city_id\": \"10\",\"city_name\": \"Galway\"},\"address_id\":\"200\", \"full_address\":\"100, B, Galway city center,Galway\" },\"delivery_instruction\": \"no call\",\"delivery_method\": \"1\" }"
let contact = Contact(json: json) // crst no call 1
contact // crst no call 1
contact?.user // name: crst - email: crat@gmail.com - phone: 018833455
contact?.user.name // "crst"
contact?.user.email // "crat@gmail.com"
contact?.user.phone // "018833455"
contact?.address // 100, B, Galway city center,Galway
contact?.address.id // 200
contact?.address.street // B
contact?.address.town // Galway city center
contact?.address.city // Galway
contact?.deliveryInstruction // "no call"
contact?.deliveryMethod // 1
这篇关于如何从json对象初始化结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!