如何在没有可选值的情况下将字典数组快速转换为json字符串[重复]

Posted

技术标签:

【中文标题】如何在没有可选值的情况下将字典数组快速转换为json字符串[重复]【英文标题】:How to convert an array of dictionaries to a json string in swift without optional value [duplicate] 【发布时间】:2018-03-29 09:15:51 【问题描述】:

我想将字典数组转换为 json 字符串,所以我使用了

func json(from object: NSMutableArray) -> String? 
    guard let data = try? JSONSerialization.data(withJSONObject: object) else 
        return nil
    

    return String(data: data, encoding: String.Encoding.utf8)

它返回一个json字符串,但在搅拌之前有一个可选

finalString = json(from: saveArray)
print(finalString)

可选("[\"CreatedOn\":\"2018 年 3 月 29 日星期四\",\"DayName\":\"Wed\",\"EmployeeID\":\"1\",\ "AppointmentType\":\"3\",\"FromTime\":\"09:00:00\",\"AppointmentDate\":\"2018 年 5 月 16 日星期三\",\"ToTime\": \"10:00:00\",\"CreatedBy\":\"40289\",\"PatientID\":\"17586\",\"ResourceID\":\"1\",\"PatientConditionId\ ":\"17590\",\"CreatedOn\":\"2018 年 3 月 29 日星期四\",\"DayName\":\"Thu\",\"EmployeeID\":\"1\" ,\"AppointmentType\":\"3\",\"FromTime\":\"09:00:00\",\"AppointmentDate\":\"2018 年 5 月 17 日星期四\",\"ToTime\ ":\"10:00:00\",\"CreatedBy\":\"40289\",\"PatientID\":\"17586\",\"ResourceID\":\"1\",\" PatientConditionId\":\"17590\",\"CreatedOn\":\"2018 年 3 月 29 日星期四\",\"DayName\":\"Fri\",\"EmployeeID\":\"1 \",\"AppointmentType\":\"3\",\"FromTime\":\"09:00:00\",\"AppointmentDate\":\"2018 年 5 月 18 日星期五\",\" ToTime\":\"10:00:00\",\"CreatedBy\":\"40289\",\"PatientID\":\"17586\",\"ResourceID\":\"1\", \"PatientConditionId\":\"17590\"]")

当我打开这个值时......

finalString = json(from: saveArray)
print(finalString!)

然后我得到...

[

"CreatedOn": "Thursday, Mar 29, 2018",
"DayName": "Wed",
"EmployeeID": "1",
"AppointmentType": "3",
"FromTime": "09:00:00",
"AppointmentDate": "Wednesday, May 16, 2018",
"ToTime": "10:00:00",
"CreatedBy": "40289",
"PatientID": "17586",
"ResourceID": "1",
"PatientConditionId": "17590"
,

"CreatedOn": "Thursday, Mar 29, 2018",
"DayName": "Thu",
"EmployeeID": "1",
"AppointmentType": "3",
"FromTime": "09:00:00",
"AppointmentDate": "Thursday, May 17, 2018",
"ToTime": "10:00:00",
"CreatedBy": "40289",
"PatientID": "17586",
"ResourceID": "1",
"PatientConditionId": "17590"
,

"CreatedOn": "Thursday, Mar 29, 2018",
"DayName": "Fri",
"EmployeeID": "1",
"AppointmentType": "3",
"FromTime": "09:00:00",
"AppointmentDate": "Friday, May 18, 2018",
"ToTime": "10:00:00",
"CreatedBy": "40289",
"PatientID": "17586",
"ResourceID": "1",
"PatientConditionId": "17590"

]

只是一个数组结构。

现在如何实现没有可选值的json字符串结构?????

【问题讨论】:

放!在 String(data: data, encoding: String.Encoding.utf8) 的末尾 不,它返回数组结构...但我想要这个字符串结构.... "[\"CreatedOn\":\"Thursday, Mar 29, 2018\",\"DayName \":\"Wed\",\"EmployeeID\":\"1\",\"AppointmentType\":\"3\",\"FromTime\":\"09:00:00\",\ "AppointmentDate\":\"2018 年 5 月 16 日星期三\",\"ToTime\":\"10:00:00\",\"CreatedBy\":\"40289\",\"PatientID\": \"17586\",\"ResourceID\":\"1\",\"PatientConditionId\":\"17590\"]" 您的问题似乎是误解了 Swift 中的可选值。我建议阅读 Apple 提供的免费 Swift 书籍(还有许多其他资源),了解什么是 Optionals 以及如何使用它们。这将允许您回答您的问题:D 恕我直言,我知道 swift 中的可选值是什么。我的问题是,当我解开字符串时,为什么结构会发生变化? 你想说"["CreatedOn":"Thursday, Mar 29, 2018","DayName":"Wed","EmployeeID":"1","AppointmentType":" 3","FromTime":"09:00:00","AppointmentDate":"2018 年 5 月 16 日,星期三","ToTime":"10:00:00","CreatedBy":"40289","PatientID ":"17586","ResourceID":"1","PatientConditionId":"17590"]" 这是swift中的json字符串结构吗? 【参考方案1】:

可以通过条件绑定来实现

if let finalString = json(from: saveArray) 
  print(finalString) //here final string is unwrapped
 else 
  print("Invalid JSON")

guard let finalString = json(from: saveArray) else 
   print("finalString is nil")
   return


print(finalString)

【讨论】:

不,我想要可选中的唯一字符串值,例如 "[\"CreatedOn\":\"Thursday, Mar 29, 2018\",\"DayName\":\" Wed\",\"EmployeeID\":\"1\",\"AppointmentType\":\"3\",\"FromTime\":\"09:00:00\",\"AppointmentDate\": \"2018 年 5 月 16 日,星期三\",\"ToTime\":\"10:00:00\",\"CreatedBy\":\"40289\",\"PatientID\":\"17586\" ,\"ResourceID\":\"1\",\"PatientConditionId\":\"17590\"]" 使用此代码,只需检查控制台,您将只获得没有“可选”的字符串值。 我得到了字符串值,但它没有反斜杠。 它打印在控制台上,这就是为什么它有“\”,否则它不会。【参考方案2】:

您将返回值声明为可选

... -> String?

所以即使结果不是,它也总是可选的。

解包或可选绑定可选

finalString! 

if let final = finalString  ...

在打印输出中去掉Optional


更好的解决方案是将函数标记为can throw,并将JSONSerialization的错误交出。与返回可选项相比,这是一种更加一致的错误处理。如果没有错误,则从 Data 对象创建的字符串永远不会是 nil

不要在 Swift 中使用NSMutableArray

func json(from object: [[String:Any]]) throws -> String 
    let data = try JSONSerialization.data(withJSONObject: object)
    return String(data: data, encoding: .utf8)!

并使用它

do 
   let finalString = json(from: ...
 catch  print(error) 

【讨论】:

我之前做过这个,现在我仔细检查了它,但它返回与可选关键字相同的值 当然,您必须将json(from 调用放入do - catch 块中。不要忽略 try? 的错误 究竟为什么要从可选字符串中删除转义字符? 反斜杠是虚拟的而不是真实的。它们只需要能够将整个字符串显示为文字字符串。 我们正在使用 .net apis,后端人员说他们想要带有反斜杠的结构。否则他们无法解析它。现在我该怎么办?

以上是关于如何在没有可选值的情况下将字典数组快速转换为json字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

可选类中的可选属性 VS 可选字典中的可选值

如何在没有副本的情况下将结构转换为字节数组?

快速更改集合可选值?

我们可以为返回可选值的 swift 函数添加 @objc 吗?

用返回非可选值的计算属性覆盖返回可选值的计算属性

Swift初见Swift可选值Optionals