2016-07-27 15 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という名前の3つのクラスのモデルを作成し、アドオン、このような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を受け入れるとき、私はnilの値を取得しています。

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) 
        } 
       } 

アドオンデータとアドオンアイテムのデータは何もありません。なぜですか?

+0

Swifty-jsonではなくGlossを使用してください。 – iMuzahid

+1

'addon_items'は配列で、' addon'は辞書です –

+0

OK、解決策を教えてください、クラスモデルは 'addon'と 'addon_items'であり、どのようにモーダルで渡すべきですか? –

答えて

3

ためAlamofireObjectMapperをチェックし、私が見たものが2つのノード(またはプロパティ)を持つオブジェクトを取得しているということです。 最初に、「Addon_items」が配列としてあり、正しいAddOnItemsクラスを作成しています。 2番目の「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レスポンスの "addon"キーをダブルチェックしてください。それには辞書オブジェクトがあり、ARRAYではないので、モデルクラスを作成してください。

編集:間違いを修正して、キャストエラーを指摘します。 私が今提案するのは、 `add_on 'キー用のJSONオブジェクトを渡すことです。 AddOnクラスで、JSONオブジェクトを取得するようにinitialiserを変更します。それからそれらを使って初期化する。 アドオンクラス初期化子

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

同様AddOnItemsために同じことを行います。そして、AddOnResponseの初期化子では、ループ内でAddOnItemsのJSONオブジェクトを反復処理します。それを初期化し、addOnItems配列プロパティに追加します。 申し訳ありません申し訳ありません、今すぐコードを書くことができます。時間制約があります。

+0

私はこのコードを使用したときにエラーが発生しました...... responseDictionary = json.dictionaryValueにしますか? [String:AnyObject] –

+0

エラーは「型['String:JSON]'の値を強制変換で「[String:AnyObject]」に変換できません " –

+0

[String:AnyObject]としてキャストしないでください。より多くのネストされたデータがあるので、そのエラーがありました。イニシャライザーに渡すときにキャストしてください。この理由は、JSONオブジェクト(SwiftJSON)内のすべての最後のノードは、最後の子孫にキャストしない限りJSON型になります。 – nishantdesai

1

これを試してください。私はAlamofireObjectMapperを使ってこれを行った。あなたのJSONレスポンスを通過した後の詳細情報

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 
    } 
} 

も、以下のようviewdidload()方法前

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

とあなたのViewControllerでの「詳細」のコードとして1つのより迅速なクラスを作成

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子供用と子供用の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 
    } 

} 
関連する問題