2016-09-18 111 views
0

我想解析这个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 
     } 

回答

1

这里是苹果的建议时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" 

} 
+0

感谢您的建议,所以怎么能有详细地址的字符串? – ava

+1

答案更新:您可以将一个属性'description'添加到'Address',并返回一个可读的字符串。然后您可以在需要时使用该属性。这有点像关系数据库。如果你有使用核心数据,你会发现它行为像“一对一关系”。 – beeth0ven