如果响应只有一个项目,则Swift 2.0 NSJSONSerialization会失败

时间:2016-04-27 21:27:05

标签: ios json swift

以下是我的代码片段:

let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
            do {
                guard let json = try NSJSONSerialization.JSONObjectWithData
(data!, options: .MutableContainers) as? [NSDictionary] else {
                    throw HttpError.ParsingFailed
                }
                completionHandler(success: true, data:json, error: nil)
            }
            catch HttpError.ParsingFailed {
...

如果响应数据有多个元素,它可以正常工作。 但是,如果响应中只有一个项目,NSJSONSerialization.JSONObjectWithData将失败(进入抛出异常的else块)。 为什么在这种情况下它仍然不解析响应,并返回一个内部有一个元素的数组? 这个问题一般应该如何解决?

当然,使用as在catch块中进行其他解析是有帮助的吗? NSDictionary而不是? [NSDictionary],但我会尽可能避免这种情况。

修改 要解析的对象有效:

[
    {
    "id": 1,
    "idConsumer": 12
    },
    {
    "id": 2,
    "idConsumer": 12
  }
]

哪个不起作用:

   {
    "id": 65,
    "delivery": {
    "id": 29,
    "idConsumer": 19
    },
    "postman": {
       "id": 13,
       "email": "testpostman"
     },
     "price": 89
    }

1 个答案:

答案 0 :(得分:1)

它失败了,因为您正在将JSON转换为[NSDictionary]。当你获得多个对象时,你会得到一个字典数组,但是当你得到一个单独的对象时,你会得到一个字典。

如果转化为NSDictionary失败,则应尝试转为[NSDictionary]

如果两者都失败,那么你应该抛出错误。