解析JSON数据
问题描述:
我想解析这个JSON:http://jsonplaceholder.typicode.com/users 我有一个查找JSON结构的问题。 我正在尝试使用这种结构很好的JSON,但我不确定这是更好的方式还是不行! 解析这个JSON数组到post实例的最好方法是什么? 有我的代码:解析JSON数据
func profileFromJSONData(data : NSData) -> ProfileResult {
do{
let jsonObject : NSArray!
= try NSJSONSerialization.JSONObjectWithData(data, options: []) as! NSArray
for profileJSON in jsonObject {
if let profile = profileFromJsonObject(profileJSON as! NSDictionary) {
finalProfile.append(profile)
}
}
return .Success(finalProfile)
}
catch let error {
return .Failure(error)
}
}
func profileFromJsonObject(json: NSDictionary) -> UserProfile?{
guard let
id = json["id"] as? Int,
name = json["name"] as? String,
userName = json["username"] as? String,
email = json["email"] as? String,
address = json["address"] as? NSDictionary,
phone = json["phone"] as? String,
website = json["website"] as? String,
company = json["company"] as? NSDictionary
else {
return nil
}
let obj = UserProfile(id: id, name: name, userName: userName, email: email, address: address, phone: phone, website: website, company: company)
return obj
}
答
这里是苹果的建议时Working with JSON in Swift,
,您可以通过使用flatMap
变化提高你的代码一行从:
for profileJSON in jsonObject {
if let profile = profileFromJsonObject(profileJSON) {
finalProfile.append(profile)
}
}
至:
finalProfile += jsonObject.flatMap(profileFromJsonObject)
这是一样的。
处理地址:
struct Address {
var street: String
var city: String
...
init?(json: [String: AnyObject]){...}
}
extension Address: CustomStringConvertible {
var description: String {
return "street: \(street), city: \(city)"
}
}
func profileFromJsonObject(json: [String: AnyObject]) -> UserProfile? {
guard let
...
addressJson = json["address"] as? [String: AnyObject]
address = Address(json: addressJson),
...
else {
return nil
}
let obj = UserProfile(id: id, name: name, userName: userName, email: email, address: address, phone: phone, website: website, company: company)
print(address) // output: "street: Kulas Light, city: Gwenborough"
}
感谢您的建议,所以怎么能有详细地址的字符串? – ava
答案更新:您可以将一个属性'description'添加到'Address',并返回一个可读的字符串。然后您可以在需要时使用该属性。这有点像关系数据库。如果你有使用核心数据,你会发现它行为像“一对一关系”。 – beeth0ven