【问题标题】:How to parse the json data using swiftJson along with Alamofire如何使用 swiftJson 和 Alamofire 解析 json 数据
【发布时间】: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


    }
   }

如何将数据传递给类并获取值

【问题讨论】:

    标签: json swift swifty-json


    【解决方案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 部分。我希望我没有把你和这个混淆。谢谢! :)
    • 不错。非常感谢。我希望你能找到你需要的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多