如何使用swiftJson和Alamofire解析json数据

时间:2016-06-27 11:44:24

标签: json swift swifty-json

我的Json数据样本。这只是一个数据样本。类似于子类别数的可用数据很多。根据子类别,项目数量不同。行数也是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": ""
                        }]
          }]
  }]

enter image description here enter image description here

我想将所有名称,所有子类别名称,所有项目名称和所有项目描述提取到特定数组中,以便我可以特别填充到不同的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 个答案:

答案 0 :(得分:0)

您的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)
}

打印:

  

可选("比萨饼&#34)
  可选(244)

现在,如果您还想使用"子类别中的数据"对于每个对象,您必须创建反映这些属性的其他模型类,例如" SubCategory" class和" Item" class(例如,那些也可以存储在每个Menu中)。并且您使用与我的示例相同的系统来填充它们 - 您只需要适应每种格式,但是现在您已经拥有了这个工作示例,它应该相当简单。诀窍是要充分了解您的JSON结构,以便您可以在模型对象中反映它。主要关注这一点,其余的将随之而来。 :)