web-dev-qa-db-ja.com

次の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、AddOn、AddOnItemsという名前の3つのクラスモデルを作成しました。

AddOnResponseクラスモデル

class AddOnResponse {

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

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

AddOnクラスモデル

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

アドオンとアドオンのデータはゼロになっています、なぜですか?

7
PRADIP KUMAR

JSONレスポンスを調べたところ、2つのノード(またはプロパティ)を持つオブジェクトを取得していることがわかりました。最初に、配列としてあり、正しいクラスAddOnItemsを作成した「addon_items」。 2番目の「アドオン」:このキーは、配列ではなく「辞書」への参照です。

したがって、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オブジェクトを取得します。次に、使用してそれらを初期化します。 AddOnクラス初期化子

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

同様に、AddOnItemsについても同じことを行います。また、AddOnResponseイニシャライザーで、AddOnItemsのJSONオブジェクトをループで繰り返します。それを初期化し、addOnItems配列プロパティに追加します。申し訳ありませんが、現時点ではコードを記述できません。時間の制約があります。

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

}
2
Ved Rauniyar

非常に多くの実験の後、私は答えを得ました。この方法でオブジェクトにデータを渡す必要があります。 @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)



                }
1
PRADIP KUMAR

これを試して。 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

モデルクラスを作成するのは非常に簡単です。以下の手順に従ってください。

Swift "Sample"という名前のクラスを作成し、次のようにコードを記述します。

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

また、もう1つSwiftクラスを以下のように「詳細」コードとして作成します。

_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で、Detailsクラスのオブジェクトを作成します

_var detailsObj = Details()
_

Alamofireリクエストメソッドから応答を得た後、以下のようにメソッドを呼び出します。

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

データは、alamofireから得られる応答に他なりません。

後で、次のように変数にアクセスできます。

_detailsObj.list[0].name
_

表示できます。

0
Arshad Shaik

ObjectMapper を使用できます

class AddOn: Mappable {
   var description: String!
   var aname: String?
   var id: String!
   var icon: String?
   var limit: String?
   var special_addon: String?
   var next: String?

   required init?(map: Map) {

   }

   // Mappable
   func mapping(map: Map) {
      description <- map["description"]
      aname <- map["aname"]
      id <- map["id"]
      icon <- map["icon"]
      limit <- map["limit"]
      special_addon <- map["special_addon"]
      next <- map["next"]
   }
}

class AddOnItems: Mappable {
   var aname: String?
   var id:String!
   var name: String!
   var order: String?
   var Sub_Add_Items: String?
   var status: String!
   var next: String!
   var price: String!

   required init?(map: Map) {

   }
   // Mappable
   func mapping(map: Map) {
      aname <- map["aname"]
      id <- map["id"]
      name <- map["name"]
      order <- map["order"]
      Sub_Add_Items <- map["Sub_Add_Items"]
      status <- map["status"]
      next <- map["next"]
      price <- map["price"]
   }
}

class requirement: Mappable {

   var addOnItems: [AddOnItems]?
   var addOn: AddOn!

   required init?(map: Map) {

   }
   // Mappable
   func mapping(map: Map) {
     addOnItems <- map["addon_items"]
     addOn <- map["addon_items"]
   }

}
0
ajaykoppisetty