如何parsing一个JSON文件在迅速?

我有一个JSON文件,要parsing和使用表视图中的对象列表。 任何人都可以共享代码来快速parsingJSON文件。

不可能更简单:

import Foundation var error: NSError? let jsonData: NSData = /* get your json data */ let jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as NSDictionary 

如何调用Web服务并在Swift Check IT中获得响应

制作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()重置我们的数据,创build一个新的空的数据对象。

build立连接后,我们将开始接收方法didReceiveData中的数据。 这里传递的数据参数就是我们所有的多汁信息的来源。 我们需要坚持每个进来的块,所以我们把它附加到我们之前清除的self.data对象上。

最后,当连接完成并接收到所有数据时,调用connectionDidFinishLoading,并准备好在我们的应用程序中使用这些数据。 万岁!

这里的connectionDidFinishLoading方法使用NSJSONSerialization类将我们的原始数据转换为有用的Dictionary对象,反序列化Url的结果。

我刚刚写了一个名为JSON的类,它使得在Swift中处理JSON像在ES5中的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() 

…或string…

 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) } 

如果您厌倦了下标,请添加您的scheme,如下所示:

 //// 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文件? ),请参阅本文中的说明,否则您将收到传输权限错误。

这是一个在Swift 2.0中进行JSON和NSData转换的代码

 // Convert from NSData to json object func nsdataToJSON(data: NSData) -> AnyObject? { do { return try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) } catch let myJSONError { print(myJSONError) } return nil } // Convert from JSON to nsdata func jsonToNSData(json: AnyObject) -> NSData?{ do { return try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted) } catch let myJSONError { print(myJSONError) } return nil; } 

我还写了一个专门用于将json响应映射到对象结构的小型库。 我在内部使用David Owens的json-swift库。 也许这对其他人有用。

https://github.com/prine/ROJSONParser

示例Employees.json

 { "employees": [ { "firstName": "John", "lastName": "Doe", "age": 26 }, { "firstName": "Anna", "lastName": "Smith", "age": 30 }, { "firstName": "Peter", "lastName": "Jones", "age": 45 }] } 

下一步你必须创build你的数据模型(EmplyoeeContainer和Employee)。

Employee.swift

 class Employee : ROJSONObject { required init() { super.init(); } required init(jsonData:AnyObject) { super.init(jsonData: jsonData) } var firstname:String { return Value<String>.get(self, key: "firstName") } var lastname:String { return Value<String>.get(self, key: "lastName") } var age:Int { return Value<Int>.get(self, key: "age") } } 

EmployeeContainer.swift

 class EmployeeContainer : ROJSONObject { required init() { super.init(); } required init(jsonData:AnyObject) { super.init(jsonData: jsonData) } lazy var employees:[Employee] = { return Value<[Employee]>.getArray(self, key: "employees") as [Employee] }() } 

然后为了实际映射来自JSON响应的对象,您只需要在构造函数中将数据作为parameter passing给EmployeeContainer类。 它会自动创build您的数据模型。

  var baseWebservice:BaseWebservice = BaseWebservice(); var urlToJSON = "http://prine.ch/employees.json" var callbackJSON = {(status:Int, employeeContainer:EmployeeContainer) -> () in for employee in employeeContainer.employees { println("Firstname: \(employee.firstname) Lastname: \(employee.lastname) age: \(employee.age)") } } baseWebservice.get(urlToJSON, callback:callbackJSON) 

控制台输出看起来如下所示:

 Firstname: John Lastname: Doe age: 26 Firstname: Anna Lastname: Smith age: 30 Firstname: Peter Lastname: Jones age: 45 

在Swift中parsingJSON对于代码生成来说是非常好的工作。 我在http://www.guideluxe.com/JsonToSwift上创build了一个工具来做到这一点。;

你提供了一个带有类名称的示例JSON对象,该工具将生成相应的Swift类以及任何需要的子Swift类来表示示例JSON所隐含的结构。 还包括用于填充Swift对象的类方法,包括使用NSJSONSerialization.JSONObjectWithData方法的类方法。 提供了NSArray和NSDictionary对象的必要映射。

从生成的代码中,只需要提供一个包含JSON的NSData对象,该对象与提供给该工具的示例相匹配。

除基金会之外,没有依赖关系。

我的作品受到了http://json2csharp.com/的启发,这对于;.NET项目非常有用。

以下是如何从JSON文件创build一个NSData对象。

 let fileUrl: NSURL = NSBundle.mainBundle().URLForResource("JsonFile", withExtension: "json")! let jsonData: NSData = NSData(contentsOfURL: fileUrl)! 

第1步:安装Swifty Json https://github.com/SwiftyJSON/SwiftyJSON

注意: 如果你正在寻找这个,也很有可能你不知道如何安装swifty。 按照https://guides.cocoapods.org/using/getting-started.html#toc_3上的说明进行操作;

sudo gem安装cocoapods

cd〜/ Path / To / Folder / Containing / ShowTracker

接下来input这个命令:

pod init

这将为您的项目创build一个默认的Podfile。 Podfile是您定义项目所依赖的依赖关系的地方。

input以下命令以使用Xcode打开Podfile进行编辑:

打开一个Xcode Podfile

将Swifty添加到podfile中

 platform :ios, '8.0' use_frameworks! target 'MyApp' do pod 'SwiftyJSON', '~> XXX' end 

第2步。检查这个例子

 var mURL = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&units=metric") if mURL == nil{ println("You are stupid") return } var request = NSURLRequest(URL: mURL!) NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in if data != nil { var mJSON = JSON(data: data!) if let current_conditions = mJSON["weather"][0]["description"].string{ println("Current conditions: " + current_conditions) } else { println("MORON!") } if let current_temperature = mJSON["main"]["temp"].double{ println("Temperature: "+ String(format:"%.f", current_temperature) + "°C" } else { println("MORON!") } } }) 

步骤3.利润

SwiftJSONParse :像恶棍一样parsingJSON

死简单,易于阅读!

例如:从这个JSON响应中获取nicknames的值"mrap"作为string

 { "other": { "nicknames": ["mrap", "Mikee"] } 

它把你的json数据NSData原样,不需要预处理。

 let parser = JSONParser(jsonData) if let handle = parser.getString("other.nicknames[0]") { // that's it! } 

免责声明:我做了这个,我希望它可以帮助每个人。 随意改善它!

使用ObjectMapper框架

 if let path = Bundle(for: BPPView.self).path(forResource: jsonFileName, ofType: "json") { do { let data = try Data(contentsOf: URL(fileURLWithPath: path), options: NSData.ReadingOptions.mappedIfSafe) let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) self.levels = Mapper<Level>().mapArray(JSONArray: (json as! [[String : Any]]))! print(levels.count) } catch let error as NSError { print(error.localizedDescription) } } else { print("Invalid filename/path.") } 

在准备适当的:可分解的对象parsing之前,

 import UIKit import ObjectMapper class Level: Mappable { var levelName = "" var levelItems = [LevelItem]() required init?(map: Map) { } // Mappable func mapping(map: Map) { levelName <- map["levelName"] levelItems <- map["levelItems"] } } 

  import UIKit import ObjectMapper class LevelItem: Mappable { var frontBackSide = BPPFrontBack.Undefined var fullImageName = "" var fullImageSelectedName = "" var bodyParts = [BodyPart]() required init?(map: Map) { } // Mappable func mapping(map: Map) { frontBackSide <- map["frontBackSide"] fullImageName <- map["fullImageName"] fullImageSelectedName <- map["fullImageSelectedName"] bodyParts <- map["bodyParts"] }} 

Swift 3

 let parsedResult: [String: AnyObject] do { parsedResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:AnyObject] } catch { // Display an error or return or whatever } 

数据 – 数据types(结构)(即由某些服务器响应返回)

使用json parsig的两种方法在收集视图中显示数据的整个viewcontroller

 @IBOutlet weak var imagecollectionview: UICollectionView! lazy var data = NSMutableData() var dictdata : NSMutableDictionary = NSMutableDictionary() override func viewDidLoad() { super.viewDidLoad() startConnection() startNewConnection() // Do any additional setup after loading the view, typically from a nib. } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return dictdata.count } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CustomcellCollectionViewCell", forIndexPath: indexPath) as! CustomcellCollectionViewCell cell.name.text = dictdata.valueForKey("Data")?.valueForKey("location") as? String let url = NSURL(string: (dictdata.valueForKey("Data")?.valueForKey("avatar_url") as? String)! ) LazyImage.showForImageView(cell.image, url:"URL return cell } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { let kWhateverHeightYouWant = 100 return CGSizeMake(self.view.bounds.size.width/2, CGFloat(kWhateverHeightYouWant)) } func startNewConnection() { let url: URL = URL(string: "YOUR URL" as String)! let session = URLSession.shared let request = NSMutableURLRequest(url: url as URL) request.httpMethod = "GET" //set the get or post according to your request // request.cachePolicy = NSURLRequest.CachePolicy.ReloadIgnoringCacheData request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData let task = session.dataTask(with: request as URLRequest) { ( data, response, error) in guard let _:NSData = data as NSData?, let _:URLResponse = response, error == nil else { print("error") return } let jsonString = NSString(data: data!, encoding:String.Encoding.utf8.rawValue) as! String } task.resume() } func startConnection(){ let urlPath: String = "your URL" let url: NSURL = NSURL(string: urlPath)! var request: NSURLRequest = NSURLRequest(URL: url) var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)! connection.start() } func connection(connection: NSURLConnection!, didReceiveData data: NSData!){ self.data.appendData(data) } func buttonAction(sender: UIButton!){ startConnection() } func connectionDidFinishLoading(connection: NSURLConnection!) { do { let JSON = try NSJSONSerialization.JSONObjectWithData(self.data, options:NSJSONReadingOptions(rawValue: 0)) guard let JSONDictionary :NSDictionary = JSON as? NSDictionary else { print("Not a Dictionary") // put in function return } print("JSONDictionary! \(JSONDictionary)") dictdata.setObject(JSONDictionary, forKey: "Data") imagecollectionview.reloadData() } catch let JSONError as NSError { print("\(JSONError)") } } 

此parsing器使用generics将JSON转换为Swifttypes,从而减less了需要input的代码。

https://github.com/evgenyneu/JsonSwiftson

 struct Person { let name: String? let age: Int? } let mapper = JsonSwiftson(json: "{ \"name\": \"Peter\", \"age\": 41 }") let person: Person? = Person( name: mapper["name"].map(), age: mapper["age"].map() ) 

Swift2 iOs9

  let miadata = NSData(contentsOfURL: NSURL(string: "https://myWeb....php")!) do{ let MyData = try NSJSONSerialization.JSONObjectWithData(miadata!, options: NSJSONReadingOptions.MutableContainers) as? NSArray print(".........\(MyData)") } catch let error as NSError{ // error.description print(error.description) } 

下面是一个Swift Playground示例:

 import UIKit let jsonString = "{\"name\": \"John Doe\", \"phone\":123456}" let data = jsonString.data(using: .utf8) var jsonObject: Any do { jsonObject = try JSONSerialization.jsonObject(with: data!) as Any if let obj = jsonObject as? NSDictionary { print(obj["name"]) } } catch { print("error") } 

Swift3中

对于Json喜欢。

  {"GetDetailsResult":{"Id":0,"Password":null,"Social":0,"UserMail":null,"UserName":null}}. 

首先,我们需要创buildjsonObect。

  let json = try JSONSerialization.jsonObject(with: data!, options: []) as! [String: AnyObject] 

那么我们需要从第一个关键点取数据(GetDetailsResult)。

 let details = json["GetDetailsResult"]! as! [String: AnyObject] 

之后,我们需要将Single值设置为Variables

  let loggedUser = details["UserName"] as! String