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格式 ...
随机推荐
- C# 委托总结
总结 委托的本质: 委托是一种特殊的数据类型,它表示某种特定类型的函数,并且可以表示多个函数,将这些函数串联起来.使用委托就好像函数调用一样. 委托实质上是一个类,编译器会根据关键字delegate自 ...
- 【C++11】 lambda表达式
i.e.int x = 10;int y = 20;int z = [&]{ x = x * x; y = y * y; return x + y;}(); 上面z后面以[]开头的为一个lam ...
- 【转载】cocos2d-x教程 Mac系统下搭建Lua的编码环境
原文链接:http://blog.csdn.net/u012945598/article/details/17168831 在使用Lua写脚本的时候大家都会因为没有代码提示导致敲代码的效率有所下降 ...
- QT5.3+VS2013+QCustomPlot+QwtPlot+QwtPlot3D使用环境配置
VS安装QT后运行环境所需配置 安装好QT和QT在VS下的插件之后: 1.打开VS,找到QT5→QT Option,如下: 2.配置电脑环境变量,在系统变量→Path下增加QT的动态库所在文件夹,也就 ...
- mvc bundle功能(2)
配置好Bundle,注册好之后,再是调用 <head> <meta charset="utf-8"> <meta http-equiv="X ...
- .net中的"异步"-手把手带你体验
周二刚过,离5.1小长假还有那么一阵,北京的天气已经开始热起来了.洗完澡,突然想起博客园一位大哥暂称呼元哥吧,当时我写了一篇windows服务的安装教程(http://www.cnblogs.com/ ...
- [Hive - LanguageManual] Create/Drop/Alter Database Create/Drop/Truncate Table
Hive Data Definition Language Hive Data Definition Language Overview Create/Drop/Alter Database Crea ...
- 在eclipse中配置spark 0.9.1源码的开发环境
一.准备工作: 1.下载release版spark 0.9.1,本次用的版本是spark-0.9.1-bin-cdh4. 2.下载scala IDE 3.0.2,这个版本ide的支持scala 2.1 ...
- SRM 508 DIV1 500pt(DP)
题目简述 给定一个大小为 n的序列(n<=10)R,要求你计算序列A0, A1, ..., AN-1的数量,要求A序列满足A0 + A1 + ... + AN-1 = A0 | A1 | ... ...
- jemalloc优化MySQL、Nginx内存管理
上一篇文章<TCMalloc优化MySQL.Nginx.Redis内存管理>,下面来看下jemalloc jemalloc源于Jason Evans 2006年在BSDcan confer ...