2016-06-01 47 views
0

當我從服務器得到JSON {"categories": "[\"a/b/c\",\"d\"]"}Alamofire + swiftyJSON陣列分析

那我怎麼才能解析它以["a/b/c", "d"]

當我使用.arrayValue,那麼它總是返回[]

+0

此迴應 - {「categories」:「[\」a/b/c \「,\」d \「]」},看起來不像它包含數組值。這是一個字符串值,爲什麼我這麼說,關鍵類別的值是用雙引號引起來的。它是一個字符串,請使用SwiftyJSON的.stringValue方法 – iamyogish

+0

是是字符串值。但我想像Array一樣使用它。我無法修改服務器端。 – Yoohogyun

回答

0

首先登場時,你從服務器得到的響應是一個字符串而不是數組。因此,當您執行.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 :)

+0

反斜槓實際上也是他的字符串的一部分。它實際上等同於'let str =「[\\\」a/b/c \\\「,\\\」d \\\「]」'。 – Rob

+0

@Rob我認爲在字符串「[\」a \ b \ c \「,\」d \「]中,反斜槓用於轉義引號。還有問題,他說他想解析它爲[「a/b/c」,「d」],所以我認爲反斜槓是用於轉義的引號,並寫了上面的代碼片段來解析[「a/b/c」,「d」]的響應。我錯了:) – iamyogish

+0

在大多數情況下,這可能是一個合理的假設,但在這種情況下,當我們意識到我們正在討論JSON時,在這種情況下,原始JSON中的反斜槓字符在引用之前標記字符這些是實際出現在JSON中的兩個單獨的字符因此,對於表示其原始JSON的'str'變量,實際上必須同時將反斜槓和引號都轉義出來。 – Rob

1

你表示你的JSON內生JSON字符串數組。你有三個選擇:

  1. 試圖通過的\"(您必須更換出現到逃脫混淆的兩個反斜槓字符,並用一個反斜槓遇到當你寫代碼的引號,如"\\\""手動掃描),然後再解析JSON。爲此,您可能會使用responseData而不是responseJSON,請手動更換字符,然後使用NSJSONSerialization手動解析它。這裏的缺點是你可能也想檢查其他轉義字符(例如,如果嵌套的JSON打印出來,那麼你可能有\n甚至\t也是你想要轉換的東西) 。

  2. 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"]] 
    
  3. 修復生成此JSON的Web服務,以便它不會這樣做蠢事。這可能是最好的解決方案,但是要弄清楚爲什麼/如何將Web服務放入JSON中,JSON需要一些偵探工作。我知道你說你不能改變服務器端,但你真的應該升級到服務器團隊中的某個人來解決這個問題。編寫客戶代碼來解決一些錯誤(無論是服務器代碼本身的錯誤,還是服務器首先提供數據的方式)都很愚蠢。

+0

同意這裏提到的所有要點。最好的解決辦法就像第三點所提到的那樣,是要麼解決問題從服務器開始,或者從服務器團隊修復它。 – iamyogish