2016-06-01 66 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