Swift 4中的JSON字符串到字典

Posted

技术标签:

【中文标题】Swift 4中的JSON字符串到字典【英文标题】:JSON String to Dictionary in Swift 4 【发布时间】:2018-12-17 06:15:00 【问题描述】:

我正在从服务器收到这种格式的 JSON 响应。

"ResponseCode":1,"StudentDetails":["Student_ID":1,"Student_SchoolID":1,"Student_BranchID":1,"Student_ClassID":1,"Student_FirstName":"1","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"19/03/2017","Student_EnrollmentNo":"1","Class_Name":"1 QA","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":true,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/student/compress/IMG100710620180809104233860.JPG","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0,"Student_ID":278324,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":14193,"Student_FirstName":"Ganu now","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"","Class_Name":"1 QA","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":false,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0,"Student_ID":267971,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":4894,"Student_FirstName":"Poonam Dillo saii","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"2211","Class_Name":"Nursery A","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":true,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/student/compress/FB_IMG_145451330612110622062018203844.jpg","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0,"Student_ID":272466,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":14193,"Student_FirstName":"Poonam ganu","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"","Class_Name":"1 QA","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":false,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0,"Student_ID":273560,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":14564,"Student_FirstName":"Ganesh kumar saini","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"","Class_Name":"Primary","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":false,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0,"Student_ID":133262,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":5065,"Student_FirstName":"Lavish saini","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"04/02/2018","Student_EnrollmentNo":"09EEBMIT29","Class_Name":"KG ICA","Student_Password":"123456","Student_PrimaryEmailID":"ganeshsaini01@gmail.com","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":true,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/student/compress/download110682201811024710015409877121411061541069294120.jpg","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0],"StudentMenusCount":["CountValue":0,"StudentId":0,"CountFor":"StudyPlanner","DatabaseID":0,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0]

现在我得到的是 JSON 字符串格式。我需要将其转换为字典。我正在使用此代码来解析 json。

let myJson = try JSONSerialization.jsonObject(with: response.data!, options: JSONSerialization.ReadingOptions.allowFragments) as Any

if myJson is String 
    print(myJson) // Printing Here as myJson is String.

如果我在上面的代码中写成:

let myJson = try JSONSerialization.jsonObject(with: response.data!, options: JSONSerialization.ReadingOptions.allowFragments) as! [String: Any]

它在抱怨糟糕的 json 比。知道如何在这里将 json 字符串转换为 Dictionary 吗?

【问题讨论】:

无法复制。 – 确切的错误信息是什么? 任何有效的 json 都不应该有任何错误。检查您的响应是否无法序列化和验证 json。 【参考方案1】:

这是这样做的方法,但你应该说出错误是什么:

 if let data = Data(result.utf8) 
  do 
     let myJson = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! [String: Any]

  catch let error 
        print(error)
 

【讨论】:

【参考方案2】:

我认为 JSON 很好,但是你解析 JSON 的方式不是。

我尝试使用此代码,结果是预期的。

let response = """
"ResponseCode":1,"StudentDetails":["Student_ID":1,"Student_SchoolID":1,"Student_BranchID":1,"Student_ClassID":1,"Student_FirstName":"1","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"19/03/2017","Student_EnrollmentNo":"1","Class_Name":"1 QA","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":true,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/student/compress/IMG100710620180809104233860.JPG","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0,"Student_ID":278324,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":14193,"Student_FirstName":"Ganu now","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"","Class_Name":"1 QA","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":false,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0,"Student_ID":267971,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":4894,"Student_FirstName":"Poonam Dillo saii","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"2211","Class_Name":"Nursery A","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":true,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/student/compress/FB_IMG_145451330612110622062018203844.jpg","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0,"Student_ID":272466,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":14193,"Student_FirstName":"Poonam ganu","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"","Class_Name":"1 QA","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":false,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0,"Student_ID":273560,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":14564,"Student_FirstName":"Ganesh kumar saini","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"","Class_Name":"Primary","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":false,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0,"Student_ID":133262,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":5065,"Student_FirstName":"Lavish saini","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"04/02/2018","Student_EnrollmentNo":"09EEBMIT29","Class_Name":"KG ICA","Student_Password":"123456","Student_PrimaryEmailID":"ganeshsaini01@gmail.com","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":true,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/student/compress/download110682201811024710015409877121411061541069294120.jpg","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0],"StudentMenusCount":["CountValue":0,"StudentId":0,"CountFor":"StudyPlanner","DatabaseID":0,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0]
"""

if let data = response.data(using: .utf8) 
  let myJson = try JSONSerialization.jsonObject(with: data, 
                                                options: JSONSerialization.ReadingOptions.allowFragments) as Any

  if myJson is String 
    print(myJson) // <-- This will not print anything as myJson is not a string
  

  if let dict = myJson as? [String: Any] 
    print(dict.keys) // <-- This will print a list of keys 
  

【讨论】:

以上是关于Swift 4中的JSON字符串到字典的主要内容,如果未能解决你的问题,请参考以下文章

使用大引号时,将字符串 JSON 转换为 Swift 中的字典

在 Swift 3 中将 JSON 字符串转换为字典

在 Swift 中将 JSON 字典导入核心数据

Swift3 JSON字符串转字典和字典转JSON字符串的实现

Swift 4 解析 1+n 数量的 json 数字键

为啥我收到“JSON 字典中的无效(非字符串)键”错误消息?