将纯字符串转换为 JSON 并返回 Swift
Posted
技术标签:
【中文标题】将纯字符串转换为 JSON 并返回 Swift【英文标题】:Convert plain string to JSON and back in Swift 【发布时间】:2017-02-12 12:32:41 【问题描述】:假设我从服务器获得了一个 JSON 字符串:"\"3\""(带引号,即这里的长度 == 3)
在 android 世界中,我可以做到:
gson.fromJson(json, new TypeToken<String>() .getType());
- 它返回 "3"(即长度 == 1)
在C#-world中,可以使用NewtonSoft.Json:
JsonConvert.DeserializeObject<string>(json, settings)
- 它返回 "3"(即长度 == 1)
另外,我确实有想要序列化为 JSON 的字符串。
在 Android 中我会做 gson.toJson("\"3\"")
和在 C# - JsonConvert.SerializeObject("\"3\"")
JSONSerialization 的问题在于它不会将纯字符串视为有效的 JSON:JSONSerialization.isValidJSONObject("\"3\"") == *false*
在 Swift / Obj-C 世界中什么是等效的?
到目前为止,我发现的丑陋的解决方法(除了添加/删除引号)是将字符串包装到 1-item-array 以使JSONSerialization
开心,然后删除“[” ”]” 来自结果 JSON 字符串(以及其他方式 - 在反序列化之前添加“[”、“]”),但这太恶心了,不能成为这个问题的真正解决方案。
【问题讨论】:
【参考方案1】:当反序列化没有数组的 JSON 或
字典作为***对象,您可以通过
.allowFragments
选项:
let jsonString = "\"3\""
let jsonData = jsonString.data(using: .utf8)!
let json = try! JSONSerialization.jsonObject(with: jsonData, options: .allowFragments)
if let str = json as? String
print(str) // 3
但是,似乎没有办法将纯字符串序列化为 JSON
使用 Foundation 库中的 JSONSerialization
类。
注意根据JSON specification, JSON 对象是名称/值对(字典)的集合或 值的有序列表(数组)。单个字符串无效 JSON 对象。
【讨论】:
以上是关于将纯字符串转换为 JSON 并返回 Swift的主要内容,如果未能解决你的问题,请参考以下文章
将 UNIX 时间从 json 导入(swift 结构)转换为日期作为字符串并填充表
使用 Swift 4 Decodable 将字符串 JSON 响应转换为布尔值
Swift:如何将带有 Alamofilre 或 SwiftyJSON 的 JSON 字符串转换为 ObjectMapper?