私の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)
}
}
アドオンとアドオンのデータはゼロになっています、なぜですか?
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配列プロパティに追加します。申し訳ありませんが、現時点ではコードを記述できません。時間の制約があります。
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
}
}
非常に多くの実験の後、私は答えを得ました。この方法でオブジェクトにデータを渡す必要があります。 @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)
}
これを試して。 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)
}
モデルクラスを作成するのは非常に簡単です。以下の手順に従ってください。
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
_
表示できます。
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"]
}
}