当我从服务器得到JSON {"categories": "[\"a/b/c\",\"d\"]"}
Alamofire + swiftyJSON阵列分析
那我怎么才能解析它以["a/b/c", "d"]
当我使用.arrayValue
,那么它总是返回[]
当我从服务器得到JSON {"categories": "[\"a/b/c\",\"d\"]"}
Alamofire + swiftyJSON阵列分析
那我怎么才能解析它以["a/b/c", "d"]
当我使用.arrayValue
,那么它总是返回[]
首先登场时,你从服务器得到的响应是一个字符串而不是数组。因此,当您执行.arrayValue时,您将获得空数组。如果要将字符串转换为数组,首先需要删除“[”&“]”,然后您需要将字符串的componentsSeparatedByString作为结果字符串的“,”。您可以使用下面的代码片段来做到这一点:
let str = "[\"a/b/c\",\"d\"]"
let filteredString = String (str.characters.filter { $0 != "[" && $0 != "]"})
print(filteredString)
let filteredStringArray = filteredString.componentsSeparatedByString(",")
print(filteredStringArray)
HTH :)
反斜杠实际上也是他的字符串的一部分。它实际上等同于'let str =“[\\\”a/b/c \\\“,\\\”d \\\“]”'。 – Rob
@Rob我认为在字符串“[\”a \ b \ c \“,\”d \“]中,反斜杠用于转义引号。还有问题,他说他想解析它为[“a/b/c”,“d”],所以我认为反斜杠是用于转义的引号,并写了上面的代码片段来解析[“a/b/c”,“d”]的响应。我错了:) – iamyogish
在大多数情况下,这可能是一个合理的假设,但在这种情况下,当我们意识到我们正在讨论JSON时,在这种情况下,原始JSON中的反斜杠字符在引用之前标记字符这些是实际出现在JSON中的两个单独的字符因此,对于表示其原始JSON的'str'变量,实际上必须同时将反斜杠和引号都转义出来。 – Rob
你表示你的JSON内生JSON字符串数组。你有三个选择:
试图通过的\"
(您必须更换出现到逃脱混淆的两个反斜杠字符,并用一个反斜杠遇到当你写代码的引号,如"\\\""
手动扫描),然后再解析JSON。为此,您可能会使用responseData
而不是responseJSON
,请手动更换字符,然后使用NSJSONSerialization
手动解析它。这里的缺点是你可能也想检查其他转义字符(例如,如果嵌套的JSON打印出来,那么你可能有\n
甚至\t
也是你想要转换的东西) 。
为responseObject
中的每个包含JSON字符串的值再次手动运行JSON解析。如果您坚持使用现有的JSON,我认为这可能是最安全的。
例如,如果原始JSON是真的只是:
{"categories": "[\"a/b/c\",\"d\"]"}
然后,你可以这样做:
Alamofire.request(request)
.responseJSON { response in
guard response.result.error == nil else {
print(response.result.error!)
return
}
do {
if let dictionary = response.result.value as? [String: String],
let categoryData = dictionary["categories"]?.dataUsingEncoding(NSUTF8StringEncoding),
let categories = try NSJSONSerialization.JSONObjectWithData(categoryData, options: []) as? [String]
{
let result = ["categories" : categories]
print(result)
}
} catch {
print(error)
}
}
然后result
是:
["categories": ["a/b/c", "d"]]
修复生成此JSON的Web服务,以便它不会这样做蠢事。这可能是最好的解决方案,但是要弄清楚为什么/如何将Web服务放入JSON中,JSON需要一些侦探工作。我知道你说你不能改变服务器端,但你真的应该升级到服务器团队中的某个人来解决这个问题。编写客户代码来解决一些错误(无论是服务器代码本身的错误,还是服务器首先提供数据的方式)都很愚蠢。
同意这里提到的所有要点。最好的解决办法就像第三点所提到的那样,是要么解决问题从服务器开始,或者从服务器团队修复它。 – iamyogish
此回应 - {“categories”:“[\”a/b/c \“,\”d \“]”},看起来不像它包含数组值。这是一个字符串值,为什么我这么说,关键类别的值是用双引号引起来的。它是一个字符串,请使用SwiftyJSON的.stringValue方法 – iamyogish
是是字符串值。但我想像Array一样使用它。我无法修改服务器端。 – Yoohogyun