Swift语言中如何使用JSON数据教程
这是一篇翻译文章,原文出处:http://www.raywenderlich.com/82706/working-with-json-in-swift-tutorial
Swift语言中如何使用JSON数据教程
JSON(全称:JavaScript Object Notation),是网络服务中传输数据的常用方法,JSON因为容易使用,且可读性强, 所以非常受到欢迎。
下面是个JSON的一个片段:
[
{"person": {"name":"Dani","age":""}},
{"person": {"name":"ray","age":""}}
]
在objective-c 中解析JSON数据相当的简单:
NSString *age = json[][@"person"][@"age"]; NSLog(@"Dani's age is %@", age);
但在更加现代化的语言swift中, 因为optionals数据类型的原因,JSON数据解析起来反而要麻烦。
if let item = json[] {
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
//
var parseError: NSError?
let parsedObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data,
options: NSJSONReadingOptions.AllowFragments,
error:&parseError)
//
if let topApps = parsedObject as? NSDictionary {
if let feed = topApps["feed"] as? NSDictionary {
if let apps = feed["entry"] as? NSArray {
if let firstApp = apps[] as? NSDictionary {
if let imname = firstApp["im:name"] as? NSDictionary {
if let appName = imname["label"] as? NSString {
//
println("Optional Binding: \(appName)")
}
}
}
}
}
}
}
运行后的结果:
Optional Binding: Clash of Clans
结合SwiftJSON第三方框架解析JSON数据
首先在github下载SwiftJSON,地址:https://github.com/lingoer/SwiftyJSON 然后 下载文件解压,然后将目录中的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"][]["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)) {
//
loadDataFromURL(NSURL(string: TopAppURL)!, completion:{(data, error) -> Void in
//
if let urlData = data {
//
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"][]["im:name"]["label"].string {
println("NSURLSession: \(appName)")
}
// More soon...
}
运行结果:
wiftyJSON: Clash of Clans NSURLSession: Clash of Clans
解析JSON到array数组
在viewController中More soon 后添加如下内容:
//
if let appArray = json["feed"]["entry"].arrayValue {
//
var apps = [AppModel]()
//
for appDict in appArray {
var appName: String? = appDict["im:name"]["label"].stringValue
var appURL: String? = appDict["im:image"][]["label"].stringValue
var app = AppModel(name: appName, appStoreURL: appURL)
apps.append(app)
}
//
println(apps)
}
从JSON 数据中遍历并保存到类型为appModel的apps数组中。
运行程序:
在真实的程序中,我们会通过UITableView或者UICollectionView显示数据。
这就是使用原生类和第三方类库SwfitJSON解析JSON数据的方法。
Swift语言中如何使用JSON数据教程的更多相关文章
- 在 Swift 语言中更好的处理 JSON 数据:SwiftyJSON
SwiftyJSON能够让在Swift语言中更加简便处理JSON数据. With SwiftyJSON all you have to do is: ? 1 2 3 4 let json = JSON ...
- Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数
Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4 为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1 ...
- WPF:使用Json.NET在TreeView中树形显示JSON数据
原文 WPF:使用Json.NET在TreeView中树形显示JSON数据 据 读者可以参考这个开源的可以树形显示XML和JSON的工具: Mgen Object 603:XML/JSON树形显示小工 ...
- 关于swift语言中导入OC三方类找不到头文件的解决方法
首先我遇到的问题是这样的: 我之前封装的OC类,我导入现在的swift工程中,然后建立桥接文件,在Swift的控制器中可以找到这个OC写的东西. 但是问题来了,当你使用cocoapods导入的OC三方 ...
- js中如何操作json数据
一.要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组. 1.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...
- Dart 和 Flutter 使用json_annotation和json_serializable来处理json数据教程
在学习fultter的时候突然想到如何去处理从服务器获取的json或者将app中的对象数据转换成json上传给服务器 于是研究一下dart对json数据的处理 首先需要依赖下面的第三方库(这里要强调下 ...
- 如何在Crystal Portlet中正确返回JSON数据给AJAX请求?
当Crystal Portlet中需要采用Ajax请求,并让后台返回Json数据时,如何才能正确.方便的返回Json数据呢? 以下两种方法均可: 方法一:Ajax请求时,采用RenderURL,对应P ...
- 在MVC中动态读取JSON数据创建表格
//使用getJSON // ("@Url.Action("GetAllUsers","User")" ,json文件的路径.也可以是 /M ...
- WebApi 中请求的 JSON 数据字段作为 POST 参数传入
使用 POST 方式请求 JSON 数据到服务器 WebAPI 接口时需要将 JSON 格式封装成数据模型接收参数.即使参数较少,每个接口仍然需要单独创建模型接收.下面方法实现了将 JSON 参数中的 ...
随机推荐
- 针对ASP.NET页面实时进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)
在介绍之前,先简单说一说ASP.NET服务端GZIP压缩模块的作用及工作原理,很多人编写网页的时候页面因为使用了大量的JS特效又或者放置很多大型动态广告导致了页面或脚本体积庞大,通常都会使用一些压缩工 ...
- SqlServer扩展存储过程
1. 扩展存储过程xp_cmdshell用法: --1.启用 SP_CONFIGURE RECONFIGURE GO SP_CONFIGURE RECONFIGURE GO --2.用法 master ...
- Android Studio新建Jni工程
2.2版本的Android Studio支持新建Jni工程,不用再像以前自己构建工程目录,首先把自己的升级自己的AS到2.2以上 然后打开Tools->Andorid->SDK manag ...
- mysql 截断
当id为int是,如果是10位数,可以插入,primary key不能重复插入,其默认值可以为NULL一个varchar字段的值如果长度设定为255,则如果其长度为256也可以插入,但已经被截取到了2 ...
- Linkclump – 批量打开多个链接[Chrome]
我的收藏 | 登录 首页 » Chrome » Linkclump – 批量打开多个链接[Chrome] 收藏 2 (1 votes) 青小蛙 on 2016.04.06. Linkclump 是一 ...
- j2ee四大作用域pagecontext,request,session,ServletContext(转)
转自:(http://www.5ycode.com/63) 在JSP页面中的对象,包括用户创建的对象(例如,JavaBean对象)和JSP的隐含对象,都有一个范围属性.范围定义了在什么时间内,在哪一个 ...
- 使用PowerShell简化我的工作
欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...
- Linq分页查询
//Linq分页查询 int pageIndex = Convert.ToInt32(HttpContext.Current.Request["PageIndex"]); int ...
- avatar Logo
用日志打印出自己的头像logo import java.io.File; import java.io.FileInputStream; import java.io.IOException; imp ...
- Thread类的使用
在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知识:线程的几种状态.上下文切换,然后接着 ...