博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift语言中如何使用JSON数据教程
阅读量:7036 次
发布时间:2019-06-28

本文共 3551 字,大约阅读时间需要 11 分钟。

原文:

这是一篇翻译文章,原文出处:http://www.raywenderlich.com/82706/working-with-json-in-swift-tutorial

 

Swift语言中如何使用JSON数据教程

 

JSON(全称:JavaScript Object Notation),是网络服务中传输数据的常用方法,JSON因为容易使用,且可读性强, 所以非常受到欢迎。

 

下面是个JSON的一个片段:

[  {
"person": {
"name":"Dani","age":"24"}}, {
"person": {
"name":"ray","age":"70"}}]

 

 

在objective-c 中解析JSON数据相当的简单:

NSString *age = json[0][@"person"][@"age"];NSLog(@"Dani's age is %@", age);

 

 

但在更加现代化的语言swift中, 因为optionals数据类型的原因,JSON数据解析起来反而要麻烦。

if let item = json[0] {  if let person = item["person"] {    if let age = person["age"] {      println(age)    }  }}

 

 

上面的代码中,每从JSON数据中解析一次就需要通过optional binding检查,这可以让代码更加安全,但也让解析工作变得复杂,如果解析饿更复杂的jsons代码变的冗余。

 

我们开始一个例子

下载。这个程序是为了获取App Store中top25的app.

里面有几个文件

TopApps.json:包含用于json解析的文件

AppModel:代表应用类

DataManager:获取本地和远程数据类,使用这个文件里的方法加载JSON数据。

viewController :目前是空的,待会我门在里面写入代码。

 

原生的解析JSON数据的方法

 

在viewController.swift文件中的viewDidLoad()方法添加如下代码:

DataManager.getTopAppsDataFromFileWithSuccess { (data) -> Void in  // 使用optional binding and NSJSONSerialization类获取排名第一的app  //1  var parseError: NSError?  let parsedObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data,    options: NSJSONReadingOptions.AllowFragments,    error:&parseError)   //2  if let topApps = parsedObject as? NSDictionary {    if let feed = topApps["feed"] as? NSDictionary {      if let apps = feed["entry"] as? NSArray {        if let firstApp = apps[0] as? NSDictionary {          if let imname = firstApp["im:name"] as? NSDictionary {            if let appName = imname["label"] as? NSString {              //3              println("Optional Binding: \(appName)")            }          }        }      }    }  }}

 

 

运行后的结果:

 

Optional Binding: Clash of Clans

 

结合SwiftJSON第三方框架解析JSON数据

 

首先在github下载SwiftJSON,地址: 然后 下载文件解压,然后将目录中的SwiftJSON.swfit拷贝到项目目录里。

 

替换viewDidLoad()内容:

override func viewDidLoad() {  super.viewDidLoad()   DataManager.getTopAppsDataFromFileWithSuccess { (data) -> Void in    // 使用SwiftyJSON 获取排名第一的app    let json = JSON(data: data)    if let appName = json["feed"]["entry"][0]["im:name"]["label"].string {      println("SwiftyJSON: \(appName)")    }  }}

 

 

我们注意首先json()初始化data,并转换成JSON对象

使用SwiftJSON的好处是,它处理了所有的optional数据类型的检查,我们只需要知道json数据的key和索引后,其他就可以交给 SwiftJSON来处理。

在上面的代码中,我门还使用了string方法获取string 值, SwiftJSON还有个arrayValue来获取数组。

运行结果:

SwiftyJSON: Clash of Clans

 

获取远程JSON数据

 

在DataManager.swift中添加下列方法:

class func getTopAppsDataFromItunesWithSuccess(success: ((iTunesData: NSData!) -> Void)) {  //1  loadDataFromURL(NSURL(string: TopAppURL)!, completion:{(data, error) -> Void in      //2      if let urlData = data {        //3        success(iTunesData: urlData)      }  })}

 

然后在viewController.swfit 中viewDidLoad()添加如下方法:

 

//从iTunes and 并通过SwiftyJSON获取排名第一的app

DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in  let json = JSON(data: iTunesData)  if let appName = json["feed"]["entry"][0]["im:name"]["label"].string {    println("NSURLSession: \(appName)")  }  // More soon...}

 

 

运行结果:

 

wiftyJSON: Clash of ClansNSURLSession: Clash of Clans

 

 

 

 

解析JSON到array数组

 

在viewController中More soon  后添加如下内容: //1if let appArray = json["feed"]["entry"].arrayValue {  //2  var apps = [AppModel]()   //3  for appDict in appArray {    var appName: String? = appDict["im:name"]["label"].stringValue    var appURL: String? = appDict["im:image"][0]["label"].stringValue     var app = AppModel(name: appName, appStoreURL: appURL)    apps.append(app)  }   //4  println(apps)}

 

 

 

从JSON 数据中遍历并保存到类型为appModel的apps数组中。

 

运行程序: 

 

在真实的程序中,我们会通过UITableView或者UICollectionView显示数据。

 

这就是使用原生类和第三方类库SwfitJSON解析JSON数据的方法。

 

转载地址:http://hrjal.baihongyu.com/

你可能感兴趣的文章
HTTP2.0
查看>>
Lintcode: Subarray Sum 解题报告
查看>>
C#防止WebBrowser在新窗口中打开链接页面
查看>>
php.ini修改php上传文件大小限制(转)
查看>>
office2003 下载地址 及密码
查看>>
/etc/vim/vimrc的一个的配置
查看>>
浏览器中关于事件的那点事儿(转)
查看>>
c#Lamdba表达式与托付
查看>>
VC皮肤库SkinSharp 1.0.6.6的使用
查看>>
php上传图片到server
查看>>
如何对 GIT 分支进行规划?
查看>>
说说非托管资源的回收
查看>>
虚拟机安装麒麟3.2时报unkown filesystem,you need to load the linux kernel first
查看>>
Node.js模块封装及使用
查看>>
java selenium (十) 操作浏览器
查看>>
检测光纤的同心性
查看>>
Vim快捷键分类
查看>>
【BOOM】一款有趣的Javascript动画效果
查看>>
关于java mail 发邮件的问题总结(转)
查看>>
Visual Prolog 的 Web 专家系统 (9)
查看>>