當我從服務器得到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