2016-07-27 69 views
2

我的JSON數據如何爲以下JSON數據創建模型類並解析它?

{ 
"addon_items" : [ 
        { 
         "aname" : "", 
         "id" : "2588", 
         "name" : "Plain Nan", 
         "order" : "1", 
         "aid" : "259", 
         "Sub_Add_Items" : "", 
         "icon" : "", 
         "status" : "1", 
         "next" : "0", 
         "price" : "0.60" 
        }, 
        { 
         "aname" : "", 
         "id" : "2589", 
         "name" : "Pitta Bread", 
         "order" : "2", 
         "aid" : "259", 
         "Sub_Add_Items" : "", 
         "icon" : "", 
         "status" : "1", 
         "next" : "0", 
         "price" : "0.00" 
        } 

        ], 

"addon" : { 
      "description" : "Please choose your Nan bread", 
      "aname" : "", 
      "id" : "259", 
      "icon" : "", 
      "limit" : "1", 
      "special_addon" : "", 
      "next" : "165" 
      } 
} 

我創建了一個名爲AddOnResponse,附加組件三類車型,AddOnItems這樣的:

AddOnResponse類模型

class AddOnResponse { 

var addon: Array<String>? 
var addonitems: Array<AnyObject>? 

init(addon:Array<String>?,addonitems: Array<AnyObject>?){ 
    self.addon = addon 
    self.addonitems = addonitems 
} 
} 

附加元件類模型

class AddOn { 


var id: Int? 
var icon: String? 
var desc: String? 
var limit: Int? 
var next: Int? 
var aname: String? 
var specialaddon: Int? 

init(id: Int?,icon: String?,desc: String?,limit: Int?,next: Int?,aname: String?,specialaddon: Int?){ 

    self.id = id 
    self.icon = icon 
    self.desc = desc 
    self.limit = limit 
    self.next = next 
    self.aname = aname 
    self.specialaddon = specialaddon 

    } 
} 

AddOnItems類模型

class AddOnItems { 


var id: Int? 
var aid: Int? 
var name: String? 
var price: Int? 
var order: Int? 
var status: Int? 
var next: Int? 
var aname: String? 
var subaddItems: Int? 
var icon: String? 

init(id: Int?,aid: Int?,name: String?,price: Int?,order: Int?,status: Int?,next: Int?,aname: String?,subaddItems: Int?,icon: String?){ 
    self.id = id 
    self.aid = aid 
    self.name = name 
    self.price = price 
    self.order = order 
    self.status = status 
    self.next = next 
    self.aname = aname 
    self.subaddItems = subaddItems 
    self.icon = icon 
    } 
} 

現在我取使用Alamofire我的JSON數據,但使用對象我得到零值接受DAT到類模型時。

var addonResponses = [AddOnResponse]() 

    Alamofire.request(.GET, myAddOnUrl) 
     .validate() 
     .responseJSON 
     { response in 
      switch response.result 
      { 
      case .Success: 
       if let value = response.result.value{ 
        let json = JSON(value) 
        print(json) 
        print(json["addon"].arrayValue) 


      for(_,content) in json{ 
       let addOnRes = AddOnResponse(addon:content["addon"].arrayValue, 
           addonitems:content["addon_items"].Arrayobject) 

         print(self.addonResponses.count) 
         print(addOnRes.addon) 
         print(addOnRes.addonitems) 
        } 
       } 

addon和addonitems數據即將來臨零,爲什麼?

+0

使用Gloss而不是Swifty-json,如果有幫助的話。 – iMuzahid

+1

因爲'addon_items'是一個數組,而'addon'是一個字典 –

+0

好吧然後告訴我解決方案,hwz類模型應該是'addon'和'addon_items'以及如何在模態中傳遞它@ÖzgürErsil –

回答

3

通過你的JSON響應會後,我看到的是你得到它具有兩個節點(或屬性)的對象。 首先 - 「addon_items」,它具有數組,併爲其創建了一個類AddOnItems,它是正確的。 Second-「addon」:這裏的這個鍵是對'Dictionary'的引用,而不是對數組的引用。

因此,要將響應存儲在AddOnResponse對象中,請嘗試以下代碼。

Alamofire.request(.GET, myAddOnUrl).validate().reponseJSON { response in 
    switch resonse.result { 
    case .Success: 
     if let value = response.result.value { 
      let json = JSON(value) 
      let responseDictionary = json.dictionaryValue as? [String: AnyObject] 
      let addOnRes = AddOnResponse(addon:responseDictionary["addon"].dictionaryValue, addonitems:responseDictionary["addon_items"].arrayValue) 
     } 
    case .Failure: 
     break 
    } 
} 

另外,還要改變你AddOnResponse類

class AddOnResponse { 
    var addon: [String: AnyObject]? 
    var addonitems: Array<AnyObject>? 

    init(addon:[String: AnyObject]?,addonitems: Array<AnyObject>?){ 
     self.addon = addon 
     self.addonitems = addonitems 
    } 
} 

TL; DR 你的JSON響應不正確對應於您在您的應用程序所做的模型。仔細檢查你的json響應的「插件」鍵,它有一個字典對象,而不是陣列,並相應地讓你的模型類。

編輯:糾正錯誤,指出鑄造錯誤。 我現在要說的是,爲`add_on'鍵傳遞JSON對象。在AddOn類中更改初始化器,以便它接受一個JSON對象。然後使用初始化它們。 附加元件類初始化劑

init(json: JSON) { 
    id = json["id"].intValue 
    name = json["name"].stringValue 
    // and so on 
} 

類似地做同樣AddOnItems。並且在AddOnResponse初始化程序中循環迭代AddOnItems的JSON對象。初始化它並附加到addOnItems數組屬性。 抱歉,現在無法編寫代碼。有時間限制。

+0

當我使用這段代碼時,我得到這行錯誤...... let responseDictionary = json.dictionaryValue as? [字符串:AnyObject] –

+0

錯誤是「無法將類型值[字符串:JSON]轉換爲在強制類型中鍵入'[String:AnyObject]」 –

+0

請勿將其轉換爲[String:AnyObject]。那個錯誤在那裏,因爲有更多的嵌套數據。在將它們傳遞給初始者時將它們投擲。這是因爲JSON對象(SwiftJSON)中的每個最後一個節點的類型都是JSON類型,除非將其轉換爲最後一個後代。 – nishantdesai

1

試試這個。我已使用AlamofireObjectMapper完成了此操作。檢查AlamofireObjectMapper更多信息

import UIKit 
import ObjectMapper 


class FollowList: Mappable { 

    var addonItems : [addonItemsList]? 
    required init?(_ map: Map) { 
     super.init(map) 
    } 
    override func mapping(map: Map) { 
     super.mapping(map) 

     addonItems <- map["addon_items"] 
    } 
    } 
    class addonItemsList : Mappable{ 
    var aname : String? 
    var id : String? 
    var name : String? 
    var order : Int? 
    var aname : Int? 

    required init?(_ map: Map) { 

    } 
    func mapping(map: Map) { 

     aname <- map["aname"] 
     id <- map["id"] 
     order <- map["order"] 
     name <- map["name"] 
     icon <- map["icon"] 

    } 

} 

     let URL = "https://raw.githubusercontent.com/tristanhimmelman/AlamofireObjectMapper/2ee8f34d21e8febfdefb2b3a403f18a43818d70a/sample_keypath_json" 


      Alamofire.request(.GET, URL)..responseArray { (response: Response<[FollowList], NSError>) in { (response: Response< FollowList, NSError>) in 
    expectation.fulfill() 

    let FollowList = response.result.value 
    print(FollowList?. addonItems) 

} 
1

經過這麼多的實驗,我得到了答案。我必須像這樣將數據傳遞給對象。我遵循@nishantdesai的答案,並做了一些修改..

Alamofire.request(.GET, myAddOnUrl) 
     .validate() 
     .responseJSON 
     { response in 
      switch response.result 
      { 
      case .Success: 
       if let value = response.result.value{ 
        let json = JSON(value) 

        let addOnRes = AddOnResponse(addon: json["addon"].object as? [String : AnyObject], 
               addonitems: json["addon_items"].arrayObject) 
        print(addOnRes.addon) 
        print(addOnRes.addonitems) 



       } 
0

它很容易創建模型類,請按照下面的過程。

創建名稱爲「Sample」的swift類,編寫代碼如下。

Class Sample{ 
    var id:String? 
    var aname:String? 
    var name:String? 
    var order:String? 
    var aid:String? 
    var Sub_Add_Items:String? 
    var icon:String? 
    var status:String? 
    var next:String? 
    var price:String? 
    func update(info: JSON) { 
     id = data["id"].string 
     aname = data["aname"].string 
     name = data["name"].string 
     order = data["order"].string 
     aid = data["aid"].string 
     Sub_Add_Items = data["Sub_Add_Items"].string 
     icon = data["icon"].string 
     status = data["status"].string 
     next = data["next"].string 
     price = data["price"].string 
    } 
} 

,也可以創建一個更快速的類作爲爲下面的「詳細信息」的代碼,

Class Details{ 
    var list: [Sample] = [Sample]() 
    func addDetails(data: JSON){ 
     for(_, detailObj) in data { 
      let sampleObj = Sample() 
      sampleObj.update(detailObj) 
      list.append(sampleObj) 
     } 
    } 
} 

,並在之前viewdidload()方法您的ViewController創建詳細的類的對象作爲

var detailsObj = Details() 

在得到alamofire請求方法的響應後,請調用以下方法:

self.detailsObj.addDetails(data!["addon_items"] as JSON) 

數據不過是您從alamofire獲得的迴應。

之後,您可以訪問的變量如下:

detailsObj.list[0].name 

,並可以顯示它。

+0

如果可能的話,如何寫一個模型班可以幫助我博士@Arshad Shaik –

+0

只需按照上面的程序,我已經提到非常清楚。如果你有任何疑問,我可以幫忙。 –

+0

我有這樣的Json http://www.json-generator.com/api/json/get/cwqUAMjKGa?indent=2我是否需要使用兩個模型類,一個用於兒童,另一個用於產品@Arshad Shaik –

0
import Foundation 
import SwiftyJSON 

class UserInfo { 

    var mobile : Int? 
    var userid : Int? 
    var email : String? 
    var name : String? 

    init() { 

    } 

    init(json : JSON){ 
     mobile = json["phone_number"].intValue 
     userid = json["id"].intValue 
     email = json["email"].stringValue 
     name = json["name"].stringValue 
    } 

}