2016-09-18 10 views
0

私はこのJSONを解析したい:http://jsonplaceholder.typicode.com/users JSON構造を見つけるのに問題があります。 私はこの構造でJSONをうまく動作させようとしていますが、これはもっと良い方法であるかわからないのですか? このJSON配列を解析してインスタンスをポストする最も良い方法は何ですか? 私のコードがある:ここでは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

変化を利用して1行にあなたのコードを向上させることができます

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

答えが更新されました: 'Address'にプロパティー' description'を追加し、読み込み可能な文字列を返すことができます。必要に応じてプロパティーを使用できます。これは、リレーショナルデータベースのようなものです。コアデータを使用している場合、それは 'to one relationship'のように動作します。 – beeth0ven