如何为以下 JSON 数据创建模型 class 并解析它?
How to create the model class for the following JSON data and parse it?
我的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"
}
}
我创建了三个 class 模型,分别命名为 AddOnResponse、AddOn、AddOnItems,如下所示:
AddOnResponse class 模型
class AddOnResponse {
var addon: Array<String>?
var addonitems: Array<AnyObject>?
init(addon:Array<String>?,addonitems: Array<AnyObject>?){
self.addon = addon
self.addonitems = addonitems
}
}
插件class模型
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 模型
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 数据,但是当使用对象将数据接受到 class 模型时,我得到的是零值。
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 数据为零,为什么?
试试这个。我使用 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)
}
通过您的 JSON 响应后,我看到您正在获得一个具有两个节点(或属性)的对象。
首先 - "addon_items" 具有数组,您为其创建了正确的 class AddOnItems。
第二- "addon":这里的这个键是对 'Dictionary' 而不是数组的引用。
因此,要将响应存储在您的 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
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 响应的 "addon" 键,它有一个字典对象而不是一个数组,因此使你的模型 classes.
编辑:纠正指向施法错误的错误。
我现在建议的是将 JSON 对象传递给 `add_on' 键。在 AddOn class 中更改初始化器,使其采用 JSON 对象。然后使用初始化它们。
AddOn Class 初始化程序
init(json: JSON) {
id = json["id"].intValue
name = json["name"].stringValue
// and so on
}
同样对 AddOnItems 执行相同的操作。并在 AddOnResponse 初始化程序中循环迭代 AddOnItems 的 JSON 对象。初始化它并附加到 addOnItems 数组 属性。
抱歉,现在无法为其编写代码。有时间限制。
经过这么多次实验,我得到了答案。我必须像这样将数据传递给对象。我按照@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)
}
创建模型非常简单class,请按照以下步骤操作。
创建 swift class 名称 "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
}
}
并再创建一个 swift class 作为 "Details" 代码,
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 class 的对象作为
var detailsObj = Details()
收到alamofire请求方法的响应后,调用如下方法:
self.detailsObj.addDetails(data!["addon_items"] as JSON)
数据只是您从 alamofire 获得的响应。
稍后您可以访问以下变量:
detailsObj.list[0].name
可以显示了
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
}
}
您可以使用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"]
}
}
我的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"
}
}
我创建了三个 class 模型,分别命名为 AddOnResponse、AddOn、AddOnItems,如下所示:
AddOnResponse class 模型
class AddOnResponse {
var addon: Array<String>?
var addonitems: Array<AnyObject>?
init(addon:Array<String>?,addonitems: Array<AnyObject>?){
self.addon = addon
self.addonitems = addonitems
}
}
插件class模型
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 模型
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 数据,但是当使用对象将数据接受到 class 模型时,我得到的是零值。
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 数据为零,为什么?
试试这个。我使用 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)
}
通过您的 JSON 响应后,我看到您正在获得一个具有两个节点(或属性)的对象。 首先 - "addon_items" 具有数组,您为其创建了正确的 class AddOnItems。 第二- "addon":这里的这个键是对 'Dictionary' 而不是数组的引用。
因此,要将响应存储在您的 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
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 响应的 "addon" 键,它有一个字典对象而不是一个数组,因此使你的模型 classes.
编辑:纠正指向施法错误的错误。 我现在建议的是将 JSON 对象传递给 `add_on' 键。在 AddOn class 中更改初始化器,使其采用 JSON 对象。然后使用初始化它们。 AddOn Class 初始化程序
init(json: JSON) {
id = json["id"].intValue
name = json["name"].stringValue
// and so on
}
同样对 AddOnItems 执行相同的操作。并在 AddOnResponse 初始化程序中循环迭代 AddOnItems 的 JSON 对象。初始化它并附加到 addOnItems 数组 属性。 抱歉,现在无法为其编写代码。有时间限制。
经过这么多次实验,我得到了答案。我必须像这样将数据传递给对象。我按照@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)
}
创建模型非常简单class,请按照以下步骤操作。
创建 swift class 名称 "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
}
}
并再创建一个 swift class 作为 "Details" 代码,
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 class 的对象作为
var detailsObj = Details()
收到alamofire请求方法的响应后,调用如下方法:
self.detailsObj.addDetails(data!["addon_items"] as JSON)
数据只是您从 alamofire 获得的响应。
稍后您可以访问以下变量:
detailsObj.list[0].name
可以显示了
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
}
}
您可以使用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"]
}
}