将纯字符串转换为 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 3 中将 JSON 字符串转换为字典

powershell 将纯文本字符串转换为安全字符串

使用 Swift 4 Decodable 将字符串 JSON 响应转换为布尔值

Swift:如何将带有 Alamofilre 或 SwiftyJSON 的 JSON 字符串转换为 ObjectMapper?

为啥 Alamofire 4.4.0 将 JSON 字符串转换为转义的 JSON 字符串(Swift 3)?