swift JSON字符串解析 json parse / json decode

这里讲解的是json字符串解析.寻常解析用三方库即可.但是有时,解析出来的数据并不是你想要的.
例如返回的数据为一个数组,但是却用json字符串包装的.那么你用原生的或三方库解析出来的数据为一个字符串类型:
[
"http://www.example.com/uploads/7186d834f55e9bd95754b12ebe6df911.jpg",
"http://www.example.com/uploads/8bd827dae398640c198f991fe7a877bb.jpg"
]

  这里用Swift代码.及解析出来的类型为String类型,本来想用的是数组,但是String缺无法转化为Array类型,我试过去掉两边中括号,并用 “逗号” 分割开.但是没有成功. 这时就需要进一步把解析出的Stirng再解析成数组

    //例如的数据,用一个常量imageJSONStr来接收的  
     let imageJSONStr = "[
"http://www.zhuluoxi.com/uploads/7186d834f55e9bd95754b12ebe6df911.jpg",
"http://www.zhuluoxi.com/uploads/8bd827dae398640c198f991fe7a877bb.jpg"
]"  
     let images = Array() //用来接收解析完成的数组  
        //字符串编码成json数据
        let data:NSData = imageJsonStr.dataUsingEncoding(NSUTF8StringEncoding)!
        var img: AnyObject? 
        do{    //解析json类型数组
            try img = NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)
        }catch let error as NSError{
            print("error: \(error)")
        }
        images = img as! Array

ok,搞定,images 就是你想要的最终的数组
再来个终极版的,用extension解决,一劳永逸,使用时,一句代码搞定:

extension String {

    var parseJSONString: AnyObject? {
        var any: AnyObject?
        let data = self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
        do{
            any = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers)
        }catch let error as NSError{
            print("error: \(error)")
        }
        return any
    }
}

使用时这样:

    let imageJSONStr = "[
"http://www.zhuluoxi.com/uploads/7186d834f55e9bd95754b12ebe6df911.jpg",
"http://www.zhuluoxi.com/uploads/8bd827dae398640c198f991fe7a877bb.jpg"
]"
    let images: Array = imageJSONStr.parseJSONString as! Array      

搞定.一句代码解决.而别别人也可以使用这个方法了.

  最后有个小问题,对于上面extension中的do catch 方法中,不能直接return,哪位高手可以指点小弟一下怎么做,不用 “any” 这个临时变量,直接在do括号中返回

你可能感兴趣的:(iOS-swift)