做过App通讯的基本上都知道最常用的格式是json和xml,不过现在xml用的越来越少了。主要是因为xml生成和通讯数据量稍大于json,而且json格式直观性比xml更强。所以现在基本上都是在用json格式。在本篇Swift开发学习中,我们就以系统自带的API来解析Json,
本人的原则是尽量使用官方的,比第三方更专业,对吧!。第三方可能编写更简单,但是殊不知如果人家的有BUG,你可能都不知道是哪里出的问题。最后还得花更多的时候找BUG出现在哪里!
为了方便测试,我自己在服务器上定义了一个简单的接口,php写的。源码如下(有条件的可以自己试试,写写简单的几个接口):
'ithtw', 'cn' => 'IT十万个为什么');
echo json_encode($array,JSON_UNESCAPED_UNICODE);
?>
文件格式我保存的是UTF-8格式,所以我们获取到的数据编码格式也是UTF-8的。如果你用GBK解析肯定中文是乱码或者还会出错。然后下面是http通讯代码
static func httpRequest(urlString :String, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void){
let url = NSURL(string: urlString)
let request = NSURLRequest(URL: url!)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()//默认配置
config.timeoutIntervalForRequest = TIME_OUT //连接超时时间
let session = NSURLSession(configuration: config)
let task = session.dataTaskWithRequest(request, completionHandler: completionHandler)
task.resume()
}调用方法如下:
HttpClient.httpRequest("http://www.it72.com/json.php", completionHandler: { (data, response, error) -> Void in
if data != nil && response != nil {
let result:String = NSString(data:data!, encoding: NSUTF8StringEncoding) as String!
print(result)
JsonParser.parse(data!)
}else{
print(error)
}
})最后就是解析方法:
static func parse(json :NSData){
let jsonObj:AnyObject? = try?NSJSONSerialization.JSONObjectWithData(json, options: NSJSONReadingOptions.AllowFragments)
if(!NSJSONSerialization.isValidJSONObject(jsonObj!)){
print("json format is invalid")
return
}
let name = jsonObj?.objectForKey("name") as! String
let cn = jsonObj?.objectForKey("cn") as! String
NSLog("%@,%@", name,cn)
}上图有真相:

最后再补充两个别人的代码,一个是读取,一个是写入。不过最后的参数和我用的不一样。可能是Swift版本不同。
先来看写入
//简单的Json =》 文本转换
var dict = ["id":"002", "name": "abc"]
var jsonDict = NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions.allZeros, error: nil)
//直接写入文件
jsonDict?.writeToFile("/正确路径/test.json", atomically: true)
//也可以把Json转换为String字符串
var str = NSString(data: jsonDict!, encoding: NSUTF8StringEncoding) 再来看解析
/*
{
"id": "001",
"name": "xyz",
"data": ["100", "220", "300", "400"]
}
*/
//从一个本地项目资源中读取data.Json文件
var path: String = NSBundle.mainBundle().pathForResource("data", ofType: "Json")!
var nsUrl = NSURL(fileURLWithPath: path)
var nsData: NSData = NSData(contentsOfURL: nsUrl!)!
//读取Json数据
var json: AnyObject? = NSJSONSerialization.JSONObjectWithData(nsData, options: NSJSONReadingOptions.allZeros, error:nil)
//读取普通数据
var id: String = json?.objectForKey("id") as String
println(id)
//读取数组类型数据
var array: [String] = json?.objectForKey("data") as [String]
println(array.count) 本文链接:http://it72.com/7949.htm