iOS开发——网络Swift篇&JSON与XML数据解析
JSON与XML数据解析
- JSON数据解析(内置NSJSONSerialization与第三方JSONKit)
- 1,顶层对象必须是NSArray或者NSDictionary
- 2,所有的对象必须是NSString、NSNumber、NSArray、NSDictionary、NSNull的实例
- 3,所有NSDictionary的key必须是NSString类型
- 4,数字对象不能是非数值或无穷
- 注意:尽量使用NSJSONSerialization.isValidJSONObject先判断能否转换成功。
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var label:UILabel = UILabel(frame:CGRectMake(, ,,)); label.text = "输出结果在控制台" self.view.addSubview(label) //测试结果在output终端输入,也可以建个命令行应用测试就可以了 testJson() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } //测试json func testJson() { //Swift对象 let user = [ "uname": "张三", "] ] //首先判断能不能转换 if (!NSJSONSerialization.isValidJSONObject(user)) { println("is not a valid json object") return } //利用OC的json库转换成OC的NSData, //如果设置options为NSJSONWritingOptions.PrettyPrinted,则打印格式更好阅读 let data : NSData! = NSJSONSerialization.dataWithJSONObject(user, options: nil, error: nil) //NSData转换成NSString打印输出 let str = NSString(data:data, encoding: NSUTF8StringEncoding) //输出json字符串 println("Json Str:"); println(str) //把NSData对象转换回JSON对象 let json : AnyObject! = NSJSONSerialization .JSONObjectWithData(data, options:NSJSONReadingOptions.AllowFragments, error:nil) println("Json Object:"); println(json) //验证JSON对象可用性 let uname : AnyObject = json.objectForKey("uname")! let mobile : AnyObject = json.objectForKey("tel")!.objectForKey("mobile")! println("get Json Object:"); println("uname: \(uname), mobile: \(mobile)") } }
输出结果如下:
Json Str: Optional({"}}) Json Object: { tel = { home = ; mobile = ; }; uname = "\U5f20\U4e09"; } get Json Object: uname: 张三, mobile:
二,使用第三方库 - JSONKit
2,将JSONKit的库文件导入到项目中来(JSONKit.h和JSONKit.m)
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. testJson() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func testJson() { //Swift 字典对象 let user = [ "uname": "user1", "] ] //使用 JSONKit 转换成为 JSON 字符串 var jsonstring = (user as NSDictionary).JSONString() println(jsonstring); //由字符串反解析回字典 println(jsonstring.objectFromJSONString() as NSDictionary) //使用 JSONKit 转换成为 NSData 类型的 JSON 数据 var jsondata = (user as NSDictionary).JSONData() println(jsondata); //由NSData 反解析回为字典 println(jsondata.objectFromJSONData() as NSDictionary) } }
输出结果:
{"}} { tel = { home = ; mobile = ; }; uname = user1; } <7b22756e 616d6522 3a227573 2c227465 6c223a7b 22686f6d 65223a22 2c226d6f 62696c65 223a2231 3338227d 7d> { tel = { home = ; mobile = ; }; uname = user1; }
目前实际开发中使用比较多的是第三方框架来解析的,后面会介绍一个比较好用,而且是大多数程序员比较喜欢的JSON解析框架:SwiftyJSON
解析XML格式数据(分别使用GDataXML和DDXML)
<?xml version="1.0" encoding="utf-8"?> <Users> <User "> <name>航歌</name> <tel> <mobile></mobile> <home>-</home> </tel> </User> <User "> <name>hangge</name> <tel> <mobile></mobile> <home>-</home> </tel> </User> </Users>
我们需要实现的功能是解析并打印出需要的数据:
User: uid:,uname:航歌,mobile:,home:- User: uid:,uname:hangge,mobile:,home:-
一,使用GDataXML(这个是google出品的)
5,导入GDataXML库文件(GDataXMLNode.h和GDataXMLNode.m),代码结构如下:
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var label:UILabel = UILabel(frame:CGRectMake(, ,,)); label.text = "输出结果在控制台" self.view.addSubview(label) //测试Swift调用Object的XML库功能 testXML() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func testXML() { //获取xml文件路径 var path = NSBundle.mainBundle().pathForResource("users", ofType:"xml") //获取xml文件内容 var xmlData = NSData(contentsOfFile:path!) //可以转换为字符串输出查看 //println(NSString(data:xmlData, encoding:NSUTF8StringEncoding)) //使用NSData对象初始化文档对象 //这里的语法已经把OC的初始化函数直接转换过来了 var doc:GDataXMLDocument = GDataXMLDocument(data:xmlData, options : , error : nil) //获取Users节点下的所有User节点,显式转换为element类型编译器就不会警告了 //var users = doc.rootElement().elementsForName("User") as GDataXMLElement[] //通过XPath方式获取Users节点下的所有User节点,在路径复杂时特别方便 var users = doc.nodesForXPath("//User", error:nil) as [GDataXMLElement] for user in users { //User节点的id属性 let uid = user.attributeForName("id").stringValue() //获取name节点元素 let nameElement = user.elementsForName(] as GDataXMLElement //获取元素的值 let uname = nameElement.stringValue() //获取tel子节点 let telElement = user.elementsForName(] as GDataXMLElement //获取tel节点下mobile和home节点 let mobile = (telElement.elementsForName(] as GDataXMLElement).stringValue() let home = (telElement.elementsForName(] as GDataXMLElement).stringValue() //输出调试信息 println("User: uid:\(uid),uname:\(uname),mobile:\(mobile),home:\(home)") } } }
二,使用DDXML
5,导入DDXML库文件
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var label:UILabel = UILabel(frame:CGRectMake(, ,,)); label.text = "输出结果在控制台" self.view.addSubview(label) //测试Swift调用Object的XML库功能 testXML() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func testXML() { //获取xml文件路径 var path = NSBundle.mainBundle().pathForResource("users", ofType:"xml") //获取xml文件内容 var xmlData = NSData(contentsOfFile:path!) //构造XML文档 var doc = DDXMLDocument(data: xmlData, options:, error:nil) //利用XPath来定位节点(XPath是XML语言中的定位语法,类似于数据库中的SQL功能) var users = doc.nodesForXPath("//User", error:nil) as [DDXMLElement] for user in users { let uid = user.attributeForName("id").stringValue() //DDXMLElementAdditions提供了elementForName获取单个节点,不用获取数组了 let uname = user.elementForName("name").stringValue() //获取tel节点的子节点 let telElement = user.elementForName("tel") as DDXMLElement let mobile = (telElement.elementForName("mobile") as DDXMLElement).stringValue() let home = (telElement.elementForName("home") as DDXMLElement).stringValue() println("User: uid:\(uid),uname:\(uname),mobile:\(mobile),home:\(home)") } } }
iOS开发——网络Swift篇&JSON与XML数据解析的更多相关文章
- iOS开发——网络Swift篇&NSURLSession加载数据、下载、上传文件
NSURLSession加载数据.下载.上传文件 NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍. 1,使用Data Task加载数据 使用全局的 ...
- iOS开发——网络Swift篇&NSURL进行数据请求(POST与GET)
NSURL进行数据请求(POST与GET) 使用Swift进行iOS开发时,不可避免的要进行远程的数据获取和提交. 其数据请求的方式既可能是POST也可能是GET.同不管是POST还是GET又可以 ...
- 玩转iOS开发 - JSON 和 Xml 数据解析
前言 Json 和xml是网络开发中经常使用的数据格式,JSON轻量级.xml相对较复杂.所以如今用JSON的比例很大.基本上从server获取的返回数据都是JSON格式的,作为iOS开发人员,解析J ...
- iOS 开发——实用技术Swift篇&Swift 懒加载(lazy)
Swift 懒加载(lazy) 在程序设计中,我们经常会使用 * 懒加载 * ,顾名思义,就是用到的时候再开辟空间,比如iOS开发中的最常用控件UITableView,实现数据源方法的时候,通常我们都 ...
- iOS-数据持久化基础-JSON与XML数据解析
解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...
- IOS开发之----NSDictionary,JSON和XML互相转换
本文永久地址为 http://www.cnblogs.com/ChenYilong/p/4044521.html,转载请注明出处. -(void)test { //XML文本范例 ...
- ios开发——实战Swift篇&简单项目的实现
学了这么久的swift语法和相关技术,今天忍不住手痒痒就写了一个swift的小项目,这个项目非常简单(只是使用一个UITableView),但是里面的功能却非常有用. 我们要实现的功能是这样的: 程序 ...
- iOS开发——常识swift篇&随机数获取
随机数获取 arc4random()这个全局函数会生成9位数的随机整数 1,下面是使用arc4random函数求一个1~100的随机数(包括1和100) var temp:Int = ...
- iOS开发网络篇—JSON数据的解析
iOS开发网络篇—JSON数据的解析 iOS开发网络篇—JSON介绍 一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式 ...
随机推荐
- Oracle中函数/过程返回结果集的几种方式
原文 Oracle中函数/过程返回结果集的几种方式 Oracle中函数/过程返回结果集的几种方式: 以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过. ...
- UiThread DEMO
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import android.a ...
- Linux+Apache+Tomcat集群配置
参考: http://blog.csdn.net/bluishglc/article/details/6867358# http://andashu.blog.51cto.com/8673810/13 ...
- bjfu1099 度度熊大战僵尸
这也是2011年百度之星的一道题. 这题我就是乱搞搞过的,打代码之前自己心里也没底,不知道能不能过的. 我的做法很简单,就是按时间顺序依次构造能杀死的僵尸血量,找到第k小的.构造的方法也很暴力:对t时 ...
- new trip
离开YY已经快一周了,特别感谢以前的老大姚冬和朱云峰,从他俩身上学到了很多.这个决定也经过了很长的纠结,不想再做个犹豫不决的人,所以最后还是坚定了最初的信念,也算是对半年前自己的一个完好交代,以防将来 ...
- Tkinter教程之Button篇(2)
本文转载自:http://blog.csdn.net/jcodeer/article/details/1811300 # Tkinter教程之Button篇(2)'''5.指定Button的宽度与高度 ...
- Windows Server 2003下ASP.NET无法识别IE11的解决方法【转】
http://www.iefans.net/windows-server-2003-asp-net-ie11-shibie/ 由于IE11对User-Agent字符串进行了比较大的改动,所以导致很多通 ...
- j2ee的十三个规范
转载 今天在做连接oracle数据库的时候,感受到了什么是规范.平时听到别人说学习j2ee一定要学习他的十三个规范,大概的知道每个规范是做什么的,每个“接口”是做什么的. 很早就听过 ...
- 转载-MySQL 加锁处理分析
MySQL 加锁处理分析 发表于 2013 年 12 月 13 日 由 hedengcheng 1 背景 1 1.1 MVCC:Snapshot Read vs Current Re ...
- POJ 2240 Arbitrage (求负环)
Arbitrage 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/I Description Arbitrage is the ...