【问题标题】:How to loop through a JSON object in Vapor 1.5 and convert it to [String:Any]?如何遍历 Vapor 1.5 中的 JSON 对象并将其转换为 [String:Any]?
【发布时间】:2019-01-18 11:53:20
【问题描述】:

我通过 Alamofire 向我的 vapor 1.5 服务器发送请求,正文类型为 [String:Any],其中 Any 类型是 String:String 的字典

当服务器收到请求时,我将其转换为 JSON 类型

 guard let reqJson = request.json else {return}

如何循环这个 JSON 对象并将其转换为 [String:Any] 的数组

我从客户端应用发送的请求正文如下所示:

 ["DHSKL3920JFLSKXFgs": 
   ["title": “some title”, 
    "body": “some body”, 
    "DHSKL3920JFLSKXFgs": "DHSKL3920JFLSKXFgs", 
    "unreadMessagesCount": 3], 

 "PKF993AVG59gkCM": 
   ["title": “some title”, 
    "body": “some body”,  
    "DHSKL39": "DHSKL39", 
     "unreadMessagesCount": 3]] 

【问题讨论】:

    标签: arrays swift vapor


    【解决方案1】:

    如果我理解正确的话。也许以下内容会有所帮助。

    //This method uses high order function map
    func convert(json:[String:Any]) -> [[String: Any]] {
        let requiredObjects = json.map { $0.value as! [String:Any] } //force unwrapping
        return requiredObjects
    }
    
    //This method uses simple loop
    func convert(json:[String:Any]) -> [[String: Any]] {
        var requiredObjects = [[String:Any]]()
        for (key, value) in json.enumerated() {
            requiredObjects.append([value.key : value.value])
        }
        return requiredObjects
    }
    

    【讨论】:

      【解决方案2】:
      struct DataFromClientSendNotifications {
      
       let title: String
       let body: String
       let sound: String
       let badge: String
       let fcmToken: String
       let unreadMessagesCount: String
      
      }
      
      
          guard let reqJson = request.json else {
            throw Abort.custom(status: .badRequest, message: message)
          }
      
         for obj in reqJson.object! {
      
              print("new obj is \(obj)")
              let objKey = obj.key
              let objValue = obj.value.object
      
              print("objectValue here is \(objValue)")
      
              let title =  objValue?["title"]?.string
              let body = objValue?["body"]?.string
              let unreadMessagesCount = objValue?["unreadMessagesCount"]?.string
              let sound = objValue?["sound"]?.string
              let badge = objValue?["badge"]?.string
              let fcmToken = objValue?["objValue"]?.string
      
               let itemCompleted = DataFromClientSendNotifications(title: title!, body: body!, sound: sound!, badge: badge!, fcmToken: fcmToken!, unreadMessagesCount: unreadMessagesCount!)
      
              print("itemCompleted is \(itemCompleted)")
              //now you can do whatever you want with  itemCompleted
      
          }
      

      【讨论】:

      • 如果有人有更优雅的解决方案,请展示一下!
      【解决方案3】:

      您可以使用 swift4 Codable 并将您的代码压缩到 4-5 行。 Documentation

      【讨论】:

      • 我正在使用 Vapor 1.5 ,Swift 3,我不能使用 Swift 4,这应该是评论,而不是答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2022-01-15
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 2018-05-13
      • 2018-05-20
      相关资源
      最近更新 更多