如何使用 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的使用

使用 SwiftJSON 将 Alamofire 结果 JSON 加载到表视图中

如何使用 DVR 会话初始化 Alamofire 管理器?

使用 Swift JSON 解析 JSON

如何创建像 Alamofire Responses 这样的块响应?

如何在 UITableView 中填充数据?迅速