当我从服务器获得JSON {"categories": "[\"a/b/c\",\"d\"]"}
时,
然后我如何将其解析为["a/b/c", "d"]
当我使用.arrayValue
时,它始终返回[]
答案 0 :(得分:1)
您的JSON中有一个表示为原始JSON字符串的数组。您有三种选择:
尝试手动扫描替换\"
的出现次数(在编写代码时,您必须容易地转义反斜杠字符和反斜杠遇到的引号,例如{在解析JSON之前{1}})。为此,您可能使用"\\\""
而不是responseData
,手动替换字符,然后使用responseJSON
自行手动解析。这里的缺点是你也可能想要检查其他转义字符(例如,如果嵌套的JSON打印得很好,那么你可能还有NSJSONSerialization
甚至\n
,你和#39; d也希望转换。)
对于\t
中包含JSON字符串的每个值,再次手动运行JSON解析。如果您坚持使用现有的JSON,我认为这可能是最安全的。
例如,如果原始json真的只是:
responseObject
然后你可以这样做:
{"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
修复生成此JSON的Web服务,以便它不会出现这种愚蠢行为。这可能是最好的解决方案,尽管需要一些侦探工作来弄清楚Web服务为什么/如何将JSON放在JSON中。我知道你说你无法改变服务器端,但你真的应该将其升级到服务器团队中的某个人来解决这个问题。编写客户端代码以解决某些错误(服务器代码本身的错误,或者服务器首先提供数据的方式)是愚蠢的。
答案 1 :(得分:0)
首先,您从服务器获取的响应是String而不是Array。因此,当你执行.arrayValue时,你将获得空数组。如果要将字符串转换为数组,首先需要删除" [" &安培; "]"然后你需要将componentsSeparatedByString和string作为","为结果字符串。您可以使用以下代码段来执行此操作:
let str = "[\"a/b/c\",\"d\"]"
let filteredString = String (str.characters.filter { $0 != "[" && $0 != "]"})
print(filteredString)
let filteredStringArray = filteredString.componentsSeparatedByString(",")
print(filteredStringArray)
HTH:)