假设我从服务器获得了一个 JSON 字符串:"\"3\""(带引号,即这里的长度 == 3)
在 Android 世界中,我可以:
gson.fromJson(json, new TypeToken<String>() {}.getType());
- 它返回 "3"(即长度 == 1)
在 C# 世界中,可以使用 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 字符串中删除“[”,“]”(以及其他方式 - 在反序列化之前添加“[”,“]”),但这太恶心了,无法成为这个问题的真正解决方案。
最佳答案
反序列化没有数组或
字典作为顶级对象,您可以传递
.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 对象。
关于ios - 将纯字符串转换为 JSON 并在 Swift 中返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42187555/