我有一个JSON文件,想要解析并使用表视图中的对象列表.任何人都可以共享代码来解析swift中的JSON文件.
不可能更简单:
import Foundation let jsonData: Data = /* get your json data */ let jsonDict = try JSONSerialization.jsonObject(with: jsonData) as? NSDictionary
我刚刚编写了一个名为JSON的类,它使Swift中的JSON处理像ES5中的JSON对象一样简单.
https://github.com/dankogai/swift-json/
将你的swift对象转换为JSON,如下所示:
let obj:[String:AnyObject] = [ "array": [JSON.null, false, 0, "",[],[:]], "object":[ "null": JSON.null, "bool": true, "int": 42, "double": 3.141592653589793, "string": "a ?\t?\n", "array": [], "object": [:] ], "url":"http://blog.livedoor.com/dankogai/" ] let json = JSON(obj) json.toString()
......或者字符串......
let json = JSON.parse("{\"array\":[...}")
...或URL.
let json = JSON.fromURL("http://api.dan.co.jp/jsonenv") Tree Traversal
只需通过下标遍历元素:
json["object"]["null"].asNull // NSNull() // ... json["object"]["string"].asString // "a ?\t?\n" json["array"][0].asNull // NSNull() json["array"][1].asBool // false // ...
就像SwiftyJSON一样,如果下标条目不存在,您也不必担心.
if let b = json["noexistent"][1234567890]["entry"].asBool { // .... } else { let e = json["noexistent"][1234567890]["entry"].asError println(e) }
如果您厌倦了下标,请添加您的方案,如下所示:
//// schema by subclassing class MyJSON : JSON { init(_ obj:AnyObject){ super.init(obj) } init(_ json:JSON) { super.init(json) } var null :NSNull? { return self["null"].asNull } var bool :Bool? { return self["bool"].asBool } var int :Int? { return self["int"].asInt } var double:Double? { return self["double"].asDouble } var string:String? { return self["string"].asString } }
然后你去:
let myjson = MyJSON(obj) myjson.object.null myjson.object.bool myjson.object.int myjson.object.double myjson.object.string // ...
希望你喜欢.
使用新的xCode 7.3+,将您的域添加到例外列表(如何将NSAppTransportSecurity添加到我的info.plist文件?)非常重要,请参阅此帖子以获取说明,否则您将收到传输权限错误.
发出API请求
var request: NSURLRequest = NSURLRequest(URL: url) var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)
准备回应
声明一个数组如下
var data: NSMutableData = NSMutableData()
收到回复
1.
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) { // Received a new request, clear out the data object self.data = NSMutableData() }
2.
func connection(connection: NSURLConnection!, didReceiveData data: NSData!) { // Append the received chunk of data to our data object self.data.appendData(data) }
3.
func connectionDidFinishLoading(connection: NSURLConnection!) { // Request complete, self.data should now hold the resulting info // Convert the retrieved data in to an object through JSON deserialization var err: NSError var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary if jsonResult.count>0 && jsonResult["results"].count>0 { var results: NSArray = jsonResult["results"] as NSArray self.tableData = results self.appsTableView.reloadData() } }
当NSURLConnection收到响应时,我们可以期望代表我们调用didReceiveResponse方法.此时,我们只需通过说self.data = NSMutableData()来重置数据,从而创建一个新的空数据对象.
建立连接后,我们将开始在方法didReceiveData中接收数据.在这里传递的数据参数是我们所有丰富信息的来源.我们需要保留每个进入的块,因此我们将它附加到我们之前清除的self.data对象中.
最后,当连接完成后,所有的数据已被接收,connectionDidFinishLoading叫我们准备在我们的应用程序使用的数据.万岁!
这里的connectionDidFinishLoading方法使用NSJSONSerialization类从您的网址反序列化的结果,我们的原始数据转换成有用的Dictionary对象.