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?
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.
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
}
}
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)
}
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)
}
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.
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"]
}
}