如何使用 swiftJson 和 Alamofire 解析 json 数据
Posted
技术标签:
【中文标题】如何使用 swiftJson 和 Alamofire 解析 json 数据【英文标题】:How to parse the json data using swiftJson along with Alamofire 【发布时间】:2016-06-27 11:44:23 【问题描述】:我的 Json 数据样本。这只是一个数据样本。同样有很多可用的数据,比如子类别的数量是 22。项目的数量根据子类别而不同。还有行数是 15,其中第一个名字是 Pizza。
[
"id": "244",
"name": "PIZZAS",
"image": "",
"coupon": "1",
"icon": "",
"order": "1",
"aname": "",
"options": "2",
"subcategory": [
"id": "515",
"name": "MARGARITA",
"description": "Cheese and Tomato",
"image": "",
"icon": "",
"coupon": "1",
"order": "1",
"aname": "",
"options": "2",
"item": [
"id": "1749",
"name": "9 Inch Thin & Crispy Margarita",
"description": "",
"price": "3.40",
"coupon": "1",
"image": "",
"options": "2",
"order": "1",
"addon": "495",
"aname": "",
"icon": ""
]
]
]
我想获取所有名称、所有子类别名称、所有项目名称和所有项目描述到特定数组中,以便我可以特别填充到不同的 tableview 中
func ParseJSON()
var MenuList = [Menu]()
Alamofire.request(.GET, myUrl)
.validate()
.responseJSON response in
switch response.result
case .Success:
if let value = response.result.value
let json = JSON(value)
print("JSON: \(json)")
for entity in json
print(entity)
MenuList.append(entity["name"]) ///error
case .Failure(let error):
print(error)
我可以使用 Alamofire 获取响应。现在如何使用 swiftJson 实现它??
更新
我已经添加了主类别、子类别和项目的类模型。
import UIKit
class Menu
var id: Int?
var name: String?
var image: UIImage?
var coupon: Int?
var icon: UIImage?
var order: Int?
var aname: Int?
var options: Int?
init(id:Int,name:String,image:UIImage,coupon:Int,icon:UIImage,order:Int,aname:Int,options:Int)
self.id = id
self.name = name
self.image = image
self.coupon = coupon
self.icon = icon
self.order = order
self.aname = aname
self.options = options
如何将数据传递给类并获取值
【问题讨论】:
【参考方案1】:您的 json
已经是一个 SwiftyJSON 对象。
这些对象总是有一个索引键和一个内容键。
因此,要遍历 json,您需要 for (_, entity) in json
而不是 for entity in json
。
_
部分是我们忽略的索引。如果我们想使用索引,我们也可以使用for (index, entity) in json
。
您还需要使用 SwiftyJSON 的类型属性,例如 .string
(可选)或 .stringValue
(非可选)。
在您的模型类中,属性类型必须反映您获得的属性类型。
要从 JSON 的第一级填充 Menu
对象数组,您可以像这样调整模型:
class Menu
var id: Int?
var name: String?
var image: String?
var coupon: Int?
var icon: String?
var order: Int?
var aname: String?
var options: Int?
init(id: Int?, name: String?, image: String?, coupon: Int?, icon: String?, order: Int?, aname: String?, options: Int?)
self.id = id
self.name = name
self.image = image
self.coupon = coupon
self.icon = icon
self.order = order
self.aname = aname
self.options = options
然后从 JSON 中填充一个数组:
var menus = [Menu]()
for (_, content) in json
let menu = Menu(id: Int(content["id"].stringValue),
name: content["name"].string,
image: content["image"].string,
coupon: content["coupon"].int,
icon: content["icon"].string,
order: Int(content["order"].stringValue),
aname: content["name"].string,
options: Int(content["options"].stringValue))
menus.append(menu)
现在您可以根据需要迭代对象:
for menu in menus
print(menu.name)
print(menu.id)
打印:
可选(“PIZZAS”) 可选(244)
现在,如果您还想使用每个对象的“子类别”中的数据,则必须创建反映这些属性的其他模型类,例如“子类别”类和“项目”类(这些也可以是例如,存储在每个菜单中)。并且您使用与我的示例相同的系统来填充它们 - 您只需要适应每种格式,但是现在您有了这个工作示例,到达那里应该相当简单。诀窍是充分了解您的 JSON 结构,以便您可以在模型对象中反映它。主要关注这一点,其余的将随之而来。 :)
【讨论】:
在填充数组时的图像部分,我认为必须使用 .string 而不是 .image。因为它给出了错误,例如无法将字符串的值转换为 UIimage 您不能有 JSON 格式的图像。在您的示例 JSON 中,我们看到"image": ""
,内容是一个字符串。此字符串(在您的示例中为空)可能是解析 JSON 后可用于获取图像的 URL。
现在我明白了。我已将其作为模态类中的 UIImage
酷!请注意,我已经关闭了您的另一个问题,因为它与这个问题相同。一旦你解决了在这个中解码你的 JSON,如果需要,你可以询问一个新的,专注于 tableView 部分。我希望我没有把你和这个混淆。谢谢! :)
不错。非常感谢。我希望你能找到你需要的答案。以上是关于如何使用 swiftJson 和 Alamofire 解析 json 数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 SwiftJSON 将 Alamofire 结果 JSON 加载到表视图中