2016-06-21 25 views
-4

我想在tableviewcells上顯示我的json數據。但是,我在將json結果附加到我的配置文件homemodel時遇到問題。我得到在我的請求管理器錯誤,說不能轉換[NSDictionary中]到NSDictionary中如何解決錯誤可以隱藏[NSDictionary]在NSDictionary在迅速?

進口基金會 類coreValueHomeModel {

//MARK: - properties 
var total: String = "total" 
var commentId: String = "commentId" 

//construct 
init(jsonData: NSDictionary){ 
    total = jsonData.objectForKey("total") as? String ?? "total" 
    commentId = jsonData.objectForKey("commentId") as? String ?? "commentId" 
} 

//construct 
init(total: String, commentId: String) { 
    self.total = total 
    self.commentId = commentId 
} 

//prints object's UserInformation 
var description: String { 
    return "total:\(total), commentId:\(commentId)" 
} 

}

進口基金會 類StrengthHomeModel {

//MARK: - properties 
var id: String = "id" 
var name: String = "name" 
var description: String = "description" 
var color: String = "color" 

//construct 
init(jsonData: NSDictionary){ 
    id = jsonData.objectForKey("id") as? String ?? "id" 
    name = jsonData.objectForKey("name") as? String ?? "name" 
    description = jsonData.objectForKey("description") as? String ?? "description" 
    color = jsonData.objectForKey("color") as? String ?? "color" 
} 

//construct 
init(id: String, name: String, description: String ,color: String) { 
    self.id = id 
    self.name = name 
    self.description = description 
    self.color = color 
} 

//prints object's UserInformation 
var des: String { 
    return "id: \(id), name: \(name), description: \(description), color: \(color)" 

} 

}

進口基金會 類ProfileHomeModel {

//MARK: - properties 
var firstName: String? = "First Name" 
var lastName: String? = "Last Name" 
var location: String? = "location" 
var title: String? = "title" 
var score: String? = "score" 
var received: String? = "received" 
var given: String? = "given" 
var coreValueResults = [coreValueHomeModel]() 
var strengthResults = [StrengthHomeModel]() 

init(jsonData: NSDictionary){ 
    firstName = jsonData.objectForKey("firstName") as? String ?? "First Name" 
    lastName = jsonData.objectForKey("lastName") as? String ?? "Last Name" 
    location = jsonData.objectForKey("location") as? String ?? "location" 
    title = jsonData.objectForKey("title") as? String ?? "title" 
    score = jsonData.objectForKey("score") as? String ?? "score" 
    received = jsonData.objectForKey("received") as? String ?? "received" 
    given = jsonData.objectForKey("given") as? String ?? "given" 

    if let commentTotals = jsonData.objectForKey("commentTotals") as? [NSDictionary] { 
     for commentTotal in commentTotals { 
      let coreValue = coreValueHomeModel(jsonData: commentTotal) 
      coreValueResults.append(coreValue) 
     } 

    } 

    if let strengths = jsonData.objectForKey("strengths") as? [NSDictionary] { 
     for strength in strengths { 
      let strengthValue = StrengthHomeModel(jsonData: strength) 
      strengthResults.append(strengthValue) 
     } 

    } 

} 

init(){ 
    firstName = nil 
    lastName = nil 
    location = nil 
    title = nil 
    score = nil 
    received = nil 
    given = nil 
    coreValueResults = [] 
    strengthResults = [] 
} 

}

import Foundation 

class ProfileRequestManager { 

    func parseJson() -> ProfileHomeModel { 
     var profileValue = ProfileHomeModel() 

     let urlPath = "*********" 
     let url = NSURL(string: urlPath) 
     let data = NSData(contentsOfURL: url!) 

     do { 
      let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as? NSDictionary 

       print(jsonData) 
       let profile = jsonData!.objectForKey("profile") as? NSDictionary 

      for profileInfo in profile! { 
       print(profileInfo) 
//problem here 
       profileValue.append(ProfileHomeModel(jsonData: profileInfo)) 

      } 

     } 
    catch{ 
    print("Something went wrong while parsing json data fetched from the API") 
    } 
     return profileValue 

     } 
    } 

而且通過NSData(contentsOfURL:)檢索的數據樣本:

{ 
    "success": true, 
    "profile": { 
    "firstName": "Vignesh", 
    "lastName": "Krish", 
    "score": "126", 
    "title": "Software Developer Intern", 
    "given": "4", 
    "received": "10", 
    "commentTotals": [ 
     { 
     "total": "4", 
     "id": "8" 
     }, 
     { 
     "total": "3", 
     "id": "9" 
     }, 
     { 
     "total": "2", 
     "id": "10" 
     }, 
     { 
     "total": "1", 
     "id": "11" 
     } 
    ], 
    "strengths": [ 
     { 
     "id": "4", 
     "name": "Analytical", 
     "description": "People exceptionally talented in the Analytical theme search for reasons and causes. They have the ability to think about all the factors that might affect a situation.", 
     "color": "9c0000" 
     }, 
     { 
     "id": "17", 
     "name": "Focus", 
     "description": "People exceptionally talented in the Focus theme can take a direction, follow through, and make the corrections necessary to stay on track. They prioritize, then act.", 
     "color": "5c3a6e" 
     }, 
     { 
     "id": "8", 
     "name": "Communication", 
     "description": "People exceptionally talented in the Communication theme generally find it easy to put their thoughts into words. They are good conversationalists and presenters.", 
     "color": "da892f" 
     }, 
     { 
     "id": "29", 
     "name": "Responsibility", 
     "description": "People exceptionally talented in the Responsibility theme take psychological ownership of what they say they will do. They are committed to stable values such as honesty and loyalty.", 
     "color": "5c3a6e" 
     }, 
     { 
     "id": "30", 
     "name": "Restorative", 
     "description": "People exceptionally talented in the Restorative theme are adept at dealing with problems. They are good at figuring out what is wrong and resolving it.", 
     "color": "5c3a6e" 
     } 
    ] 
    } 
} 
+0

聽起來像對象被序列化爲一個直接的字典,而不是一個字典數組。你可以發佈你通過'NSData(contentsOfURL:)'檢索到的數據的相關片段嗎? – Palpatim

+0

我發佈了我試圖以json格式檢索的數據 –

+0

那麼,你的數據片段很清楚地顯示你的問題:'profile'是一個字典。你正試圖把它轉換成一個字典數組。將您的演員從'[NSDictionary]'更改爲'NSDictionary' – Palpatim

回答

0

您正試圖轉換一個數組([NSDictionary])給個人NSDictionary,這是不允許的。訪問數組,你必須得到你正在尋找的。

例如。

let myProfile = profile.firstObject 
0

NSDictionary[NSDictionary]

let profile = jsonData!.objectForKey("profile") as? NSDictionary 

有你的代碼其它問題,以及像這沒有任何意義,並會造成以下的錯誤。

for profile in profile { 
    print(profile) 
} 
+0

我做了你所提到的改變。它給了我一個錯誤,說profilehomemodel沒有成員類型追加 –

+0

@VigneshKrish添加'ProfileHomeModel'的代碼。 – Code

+0

完成!它在後 –

0

有效的json字符串可以通過數組或字典。如果你不知道json字符串的格式是什麼,你應該在處理它的內容之前檢查它的類型。

do { 
    if let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as? NSDictionary { 
     //got a dictionary, do your works with this dictionary 
    } else if let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as? NSArray { 
     //got an array, do your works with this dictionary 
    } else { 
     //is not a valid json data 
    } 
} catch let _error as NSError { 
    //got error 
}