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

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

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

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,地址: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"][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 Clans

NSURLSession: Clash of Clans

解析JSON到array数组

在viewController中More soon  后添加如下内容:

//1

if 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数据的方法。

时间: 2024-10-14 12:32:12

Swift语言中如何使用JSON数据教程的相关文章

在 Swift 语言中更好的处理 JSON 数据:SwiftyJSON

SwiftyJSON能够让在Swift语言中更加简便处理JSON数据. With SwiftyJSON all you have to do is: ? 1 2 3 4 let json = JSONValue(dataFromNetworking) if let userName = json[0]["user"]["name"].string{   //Now you got your value } And don't worry about the Opti

Swift语言中的泛型编程 【Generic】【Part 1】

泛型  泛型编程让你可以编写更具扩展性.易重用的功能,代码使用时的类型取决于你所定义的业务需求.你可以编写避免重复的代码,目标更加清晰明确,风格抽象. 泛型是Swift语言的一项强大的特性,基本上所有的swift标准库都建立在泛型代码上.实际上,你在这本书的时候不知不觉地接触到泛型,它贯穿始终.例如Swift的数组和字典类型都是泛型集合.你可以创建用于存放整数值的数组,也创建数组存储字符串,其他所有能在Swift中创建的类型都可以创建到数组中.类似的,你可以创建字典来存储数值或其他指定的类型,毫

Swift语言中的属性,方法,下标脚本以及继承

从这篇章节起,Swift编程语言指南大部分的重要内容在于概念,代码并不是太多.理解Swift的面向对象理念,语法以及类结构,构造析构过程对于很好的应用Swift语言将会有比较大的帮助. 属性 存储属性 存储属性通常是那些可以通过直接赋值,或者直接访问成员能够获得的属性类型. 它有些要注意的地方: 若一个结构体被声明为常量,则子属性无法被修改了.在Objective-C中,我们总是无法修改结构体的子属性,但是swift却可以,不过这种情况是个例外,当你存储型属性是个结构体并且是个常量,那你就不要再

Swift语言中的集合类——字典 使用方法

字典 字典是一种存储相同类型多重数据的存储器.每个值(value)都关联独特的键(key),键作为字典中的这个值数据的标识符.和数组中的数据项不同,字典中的数据项并没有具体顺序.我们在需要通过标识符(键)访问数据的时候使用字典,这种方法很大程度上和我们在现实世界中使用字典查字义的方法一样. Swift 的字典使用时需要具体规定可以存储键和值类型.不同于 Objective-C 的NSDictionary和NSMutableDictionary 类可以使用任何类型的对象来作键和值并且不提供任何关于

SpringMVC中controller接收Json数据

SpringMVC中controller接收Json数据 1.jsp页面发送ajax的post请求: function postJson(){ var json = {"username" : "imp", "password" : "123456"}; $.ajax({ type : "post", url : "<%=basePath %>ajaxRequest", co

?Swift语言中为外部参数设置默认值,可变参数,常量参数,变量参数,输入输出参数

引用自这里:Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 目录[-] 7.4.4  为外部参数设置默认值 7.4.5  可变参数 7.4.6  常量参数和变量参数 7.4.7  输入-输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1.2语言快速入门v2.0. [示例7-11]以下的代码就为外部参数toString.withJoiner设置了默认的参数"Swift"和&qu

SpringMVC中controller返回json数据的两种方法

SpringMVC中controller返回json数据的两种方法 1.jsp的ajax请求: function getJson(){ $.ajax({ type:"get", dataType:"json", url:"<%=basePath %>getJson", success:function(data){ for(var i=0;i<jsonData.length;i++){ alert("Id:"

?Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1.2语言快速入门v2.0. [示例7-11]以下的代码就为外部参数toString.withJoiner设置了默认的参数"Swift"和"---".代码如下: import Foundation func join(string s1: String, toString

day20 java 语言中的读取写入数据(一)

day20  java 语言中的读取写入数据(一) 一.io概述 io数据流的读写功能,在实际的生活中也很常见,比如文件的上传.下载,日志的自动更新等都与io读写密切相关.io又被分为了读取数据和写入数据两个大的功能.下面就来看看读取数据的几种类. 二.读取数据的几种方式 读取数据被分为了字节流读取数据,和字符流读取数据两种. (一):字符输入流: 1.fileReader类.是字符流读取数据 2.BufferedReader类.带有缓冲流读取数据 (二):字节输入流: 1.FileInputS