从推送通知解析时出现 SwiftyJson 解析问题

Posted

技术标签:

【中文标题】从推送通知解析时出现 SwiftyJson 解析问题【英文标题】:SwiftyJson Parsing Issue When Parsing from a Push Notification 【发布时间】:2017-09-21 19:30:01 【问题描述】:

关于使用 Swifty JSON 解析 JSON 的问题

这是 **SwiftyJSON* 问题:我试图解析来自推送通知的一些 JSON,但我似乎无法将其转换为单个值

if let json = try? JSON(data: data) 
print("before")
print(json["data"].stringValue)   
print ("after")

我最终得到控制台输出

before


   "apiKey":
      "data":
         "user_id":8,
         "id":75,
         "secret":"G4UgMXXXXnt0bviGjNHCPRY4nYjuvXMrEkaU2dxqOC9j7XiIy4uS1TNLxv4Kev7w"
      
   ,
   "verified":true,
   "loneWorker":
      "data":
         "vehicle_make":null,
         "gender":null,
         "mobile":"+447900007213",
         "vehicle_model":null,
         "hair_colour":null,
         "distinguishing_features":null,
         "firebase_token":"dsMGqAn57eo:APA91bHcE_8hoCQ9qgJfpr4b6yDrUkkkeJL7oGx-410v7hKyZfgBkcvROHevTmojJ6CvQrspDOvvXnXo9psTRKdnlQAEYzdvBE8OtsxHf-3JRmDRbJCiTrsVowDgQ5FeN7QQaEfMbFH",
         "vehicle_colour":null,
         "vrm":null,
         "arc":
            "data":
               "prealert_sms_number":"+447506000094",
               "sos_sms_number":"+44750000894",
               "id":1,
               "sos_call_number":"+447500000094"
            
         ,
         "build":null,
         "dob":null,
         "duress_word":null,
         "name":"Stevan ",
         "id":8,
         "preexisting_conditions":null,
         "email":"xxxxxx@hotmail.com",
         "height":null
      
   


after

但如果我尝试这样做: print(json["data"]["apiKey"]["secret"].stringValue) 我什么也得不到。

我对此有一个心理障碍,无法用 SwiftyJSON 或任何其他正常方式解析它...

[编辑:谢天谢地,我找到了这个问题的答案,您可能会在下面的 cmets 中看到。这些天来,我现在喜欢 Codable 作为一个很好的现代替代品]。

【问题讨论】:

小贴士:一块一块地做。因为当您写json["data"]["apiKey"]["secret"].stringValue 时,您不知道它从哪里开始“失败”。所以json["data"],然后是json["data"]["apiKey"],然后是json["data"]["apiKey"]["secret"],这就是失败的地方。但是你会发现你需要在["apiKey"] 之后做一个["data"] 由于我的输入格式异常,我不得不检索 json["data"] 并再次将其从字符串解析为 json,如下所示: if let json = try? JSON(数据:数据)让解析JSON:AnyObject? = (json["data"].stringValue).parseJSONString // 通过传入 json["data"].stringValue 降低一个级别 let swifyJSON = JSON(parsedJSON) // 使该级别 SwiftyJSON 准备就绪 extension String var parseJSONString: AnyObject?let data = self.data(using: String.Encoding.utf8, allowLossyConversion: false) if let jsonData = data do let message = try JSONSerialization. jsonObject(with: jsonData, options:.mutableContainers) if let jsonResult = message as? NSMutableArray return jsonResult //会返回json数组输出 else if let jsonResult = message as? NSMutableDictionary return jsonResult //会返回json字典输出 else return nil catch let error as NSError print("An error occurred: (error)") return nil else return nil 跨度> 【参考方案1】:

您以错误的方式访问该值。 您必须使用json["data"]["apiKey"]["data"]["secret"].stringValue 访问该值。

【讨论】:

以上是关于从推送通知解析时出现 SwiftyJson 解析问题的主要内容,如果未能解决你的问题,请参考以下文章

解析 SDK 以获取推送通知、编译错误

从 SwiftyJSON API 分配解析的 JSON 显示错误

在 Android 上解析接收通知

如何使用解析推送通知打开 URL?

如何在我的解析服务器上实现 Android 和 IOS 应用程序的预定推送通知?

从 PHP 发送推送通知时出现主键错误