我的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的类模型,如下所示:
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)
}
}
addon和addonitems数据为零,为什么?
答案 0 :(得分:7)
在完成JSON响应之后,我看到的是你得到的对象有两个节点(或属性)。 首先 - &#34; addon_items&#34;它有as数组,你已经为它创建了一个正确的AddOnItems类。 第二个&#34;插件&#34;:这里的这个键是指一个&#39;字典&#39;而不是数组。
因此,要将响应存储在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响应未与您在应用中制作的模型正确对应。仔细检查&#34;插件&#34;你的json响应的关键字,它有一个字典对象,而不是一个ARRAY,因此你的模型类。
编辑:纠正错误以指出投射错误。 我现在建议的是传递`add_on&#39;的JSON对象。键。在AddOn类中更改初始化程序,以便它采用JSON对象。然后使用初始化它们。 AddOn Class Initialiser
init(json: JSON) {
id = json["id"].intValue
name = json["name"].stringValue
// and so on
}
同样对AddOnItems也这样做。并且在AddOnResponse初始化器中循环迭代AddOnItems的JSON对象。初始化它并附加到addOnItems数组属性。 抱歉,目前无法为其编写代码。有时间限制。
答案 1 :(得分:2)
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 :(得分:1)
试试这个。我使用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)
}
答案 3 :(得分:1)
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)
}
答案 4 :(得分:0)
创建模型类非常简单,请按照以下步骤进行操作。
创建名为&#34;样本&#34;的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
}
}
并且还创建一个更快速的类作为&#34;细节&#34;代码如下,
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
你可以显示它。
答案 5 :(得分:0)
您可以使用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"]
}
}