web-dev-qa-db-fra.com

Comment créer la classe de modèle pour les données JSON suivantes et les analyser?

Mes données 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"
           }
 }

J'ai créé trois modèles de classe nommés AddOnResponse, AddOn, AddOnItems comme ceci:

Modèle de classe AddOnResponse

class AddOnResponse {

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

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

Modèle de classe 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

  }
 }

Modèle de classe 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
   }
 }

Maintenant, je récupère mes données JSON en utilisant Alamofire, mais lorsque j'accepte des données dans un modèle de classe à l'aide d'un objet, la valeur Nil est nulle.

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

Les données de l'addon et des addonitems arrivent à zéro, pourquoi? 

6
PRADIP KUMAR

Après avoir examiné votre réponse JSON, je constate que vous obtenez un objet comportant deux noeuds (ou propriétés). First- "addon_items" qui a comme tableau et pour lequel vous avez créé une classe AddOnItems qui est correcte . Second- "addon": cette clé ici est une référence à un 'Dictionnaire' plutôt qu'à un tableau .

Donc, pour stocker la réponse dans votre objet AddOnResponse, essayez le code suivant. 

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

Apportez également des modifications à votre classe 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 Votre réponse JSON ne correspond pas correctement au modèle que vous avez créé dans votre application. Revérifiez la clé "addon" de votre réponse JSON qui contient un objet dictionnaire et PAS UN ARRAY et créez en conséquence vos classes de modèle.

Edit: Rectifier l’erreur pour indiquer l’erreur de transt ..... Je suggérerais maintenant de transmettre l’objet JSON pour la clé `add_on '. Dans la classe AddOn, changez l’initialiseur pour qu’il utilise un objet JSON. Puis en les initialisant avec .Initialiser la classe AddOn

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

De même faire la même chose pour AddOnItems. Et dans l'initialiseur AddOnResponse, itérez dans une boucle l'objet JSON pour AddOnItems. Initialisez-le et ajoutez-le à la propriété du tableau addOnItems . Sorry ne peut pas écrire le code pour le moment. Vous avez une contrainte de temps.

7
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

Après tant d'expériences, j'ai eu la réponse. Je dois transmettre les données à des objets comme celui-ci. J'ai suivi les réponses de @nishantdesai et fait quelques modifications.

 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

Essaye ça. J'ai fait cela en utilisant AlamofireObjectMapper. Vérifiez AlamofireObjectMapper pour plus d'informations

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
Prashant Ghimire

Il est très simple de créer une classe de modèle. Suivez la procédure ci-dessous.

Créez une classe Swift avec le nom "Sample", écrivez le code ci-dessous.

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

et créez également une classe Swift supplémentaire en tant que code "Détails" comme ci-dessous,

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

et dans votre méthode viewcontroller before viewdidload(), créez un objet de la classe Details comme 

var detailsObj = Details()

Après avoir reçu la réponse de la méthode de requête alamofire, appelez la méthode comme suit:

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

Les données ne sont rien d'autre que la réponse que vous obtenez d'Alamofire.

Plus tard, vous pouvez accéder aux variables ci-dessous:

detailsObj.list[0].name

et vous pouvez l'afficher.

0
Arshad Shaik

Vous pouvez utiliser 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