【问题标题】:How to convert an array of dictionaries to a json string in swift without optional value [duplicate]如何在没有可选值的情况下将字典数组快速转换为json字符串[重复]
【发布时间】: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字符串结构吗?

标签: ios arrays json xcode swift4


【解决方案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,后端人员说他们想要带有反斜杠的结构。否则他们无法解析它。现在我该怎么办?
猜你喜欢
  • 2015-02-22
  • 2015-04-04
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多