Alamofire + swiftyJSON数组解析

时间:2016-06-01 03:30:58

标签: swift parsing alamofire swifty-json

当我从服务器获得JSON {"categories": "[\"a/b/c\",\"d\"]"}时,

然后我如何将其解析为["a/b/c", "d"]

当我使用.arrayValue时,它始终返回[]

2 个答案:

答案 0 :(得分:1)

您的JSON中有一个表示为原始JSON字符串的数组。您有三种选择:

  1. 尝试手动扫描替换\"的出现次数(在编写代码时,您必须容易地转义反斜杠字符和反斜杠遇到的引号,例如{在解析JSON之前{1}})。为此,您可能使用"\\\""而不是responseData,手动替换字符,然后使用responseJSON自行手动解析。这里的缺点是你也可能想要检查其他转义字符(例如,如果嵌套的JSON打印得很好,那么你可能还有NSJSONSerialization甚至\n,你和#39; d也希望转换。)

  2. 对于\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
  3. 修复生成此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:)