iOS开发——网络Swift篇&JSON与XML数据解析

时间:2022-09-01 17:40:45

JSON与XML数据解析

  • JSON数据解析(内置NSJSONSerialization与第三方JSONKit)
 
一,使用自带的NSJSONSerialization
苹果从IOS5.0后推出了SDK自带的JSON解决方案NSJSONSerialization,这是一个非常好用的JSON生成和解析工具,效率也比其他第三方开源项目高。
 
NSJSONSerialization能将JSON转换成Foundation对象,也能将Foundation对象转换成JSON,但转换成JSON的对象必须具有如下属性:
  • 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 

  #include "JSONKit.h" 
1,新建桥街头文件Bridging-Header.h,并设置到编译参数里
 

  2,将JSONKit的库文件导入到项目中来(JSONKit.h和JSONKit.m)

3,这时编译会发现报错,这是由于JSONKit库不支持Objective-C的自动引用计数功能导致。
需要在Build Phases -> Compile Sources -> JSONKit.m,双击添加Comipler Flag:-fno-objc-arc 。这样就完成了不支持自动引用计数的配置。
 iOS开发——网络Swift篇&JSON与XML数据解析
 
测试代码:
 
 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解析,比如获取Web Service数据,读取RSS新闻或者博客数据源。下面演示了两个非常方便高效的XML库在Swift里的调用方法。
假设需要被解析的XML数据文件users.xml如下:
 
 <?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出品的) 

1,在build phases -> Link Binary With Libraries中,点击“+”添加“libxml2.2.dylib”
 iOS开发——网络Swift篇&JSON与XML数据解析
 
2,在build setting -> Header Search Paths里添加 ${SDK_DIR}/usr/include/libxml2
 iOS开发——网络Swift篇&JSON与XML数据解析
 
3,在build setting里的Objective-C编译选项里,把自动引用计数改为No,否则在应用GDataXML库时会编译有错
 iOS开发——网络Swift篇&JSON与XML数据解析
 
4,添加bridge.h头文件并设置到编译参数里
  #import "GDataXMLNode.h" 

5,导入GDataXML库文件(GDataXMLNode.h和GDataXMLNode.m),代码结构如下:

 iOS开发——网络Swift篇&JSON与XML数据解析
 
6,开始解析(ViewController.swift)
 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

1,2,3步同上
4,添加bridge.h头文件并设置到编译参数里
  #import "DDXMLElementAdditions.h" 

  5,导入DDXML库文件

6,开始解析(ViewController.swift)
 
 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数据解析的更多相关文章

  1. iOS开发——网络Swift篇&amp&semi;NSURLSession加载数据、下载、上传文件

    NSURLSession加载数据.下载.上传文件   NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍.   1,使用Data Task加载数据 使用全局的 ...

  2. iOS开发——网络Swift篇&amp&semi;NSURL进行数据请求(POST与GET)

    NSURL进行数据请求(POST与GET)   使用Swift进行iOS开发时,不可避免的要进行远程的数据获取和提交. 其数据请求的方式既可能是POST也可能是GET.同不管是POST还是GET又可以 ...

  3. 玩转iOS开发 - JSON 和 Xml 数据解析

    前言 Json 和xml是网络开发中经常使用的数据格式,JSON轻量级.xml相对较复杂.所以如今用JSON的比例很大.基本上从server获取的返回数据都是JSON格式的,作为iOS开发人员,解析J ...

  4. iOS 开发——实用技术Swift篇&amp&semi;Swift 懒加载&lpar;lazy&rpar;

    Swift 懒加载(lazy) 在程序设计中,我们经常会使用 * 懒加载 * ,顾名思义,就是用到的时候再开辟空间,比如iOS开发中的最常用控件UITableView,实现数据源方法的时候,通常我们都 ...

  5. iOS-数据持久化基础-JSON与XML数据解析

    解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...

  6. IOS开发之----NSDictionary,JSON和XML互相转换

    本文永久地址为 http://www.cnblogs.com/ChenYilong/p/4044521.html,转载请注明出处.     -(void)test {     //XML文本范例   ...

  7. ios开发——实战Swift篇&amp&semi;简单项目的实现

    学了这么久的swift语法和相关技术,今天忍不住手痒痒就写了一个swift的小项目,这个项目非常简单(只是使用一个UITableView),但是里面的功能却非常有用. 我们要实现的功能是这样的: 程序 ...

  8. iOS开发——常识swift篇&amp&semi;随机数获取

    随机数获取   arc4random()这个全局函数会生成9位数的随机整数   1,下面是使用arc4random函数求一个1~100的随机数(包括1和100)     var temp:Int = ...

  9. iOS开发网络篇—JSON数据的解析

    iOS开发网络篇—JSON数据的解析 iOS开发网络篇—JSON介绍 一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式 ...

随机推荐

  1. Java并发编程学习笔记(一)——线程安全性

    主要概念:线程安全性.原子性.原子变量.原子操作.竟态条件.复合操作.加锁机制.重入.活跃性与性能. 1.当多个线程访问某个状态变量并且其中有一个线程执行写入操作时,必须采用同步机制来协同这些线程对变 ...

  2. NDK各版本下载

    含r8e,r9d,r10c 其中x86_64代表64位系统 官网上只有最新版下载链接,如果想要下载以前的版本,可打开 https://archive.org/web/ 然后输入 http://deve ...

  3. Enterprise Library - Data Access Application Block 6&period;0&period;1304

    Enterprise Library - Data Access Application Block 6.0.1304 企业库,数据访问应用程序块 6.0.1304 企业库的数据访问应用程序块的任务简 ...

  4. &lbrack;liu yanling&rsqb;测试小结

    编写测试用例,业务了解是基础,结合业务编写测试用例,重要的逻辑一定要覆盖

  5. Note&lowbar;JavaWeb&lowbar;SpringMVC&lowbar;尚硅谷

    Spring MVC框架 官网文档 \spring-framework-4.2.6.RELEASE\docs\spring-framework-reference\htmlsingle ------- ...

  6. 任意activity作为启动页

    在androidManifest.xml中对应的activity中添加 android:exported=“true”

  7. Oracle的实例恢复解析

    在数据库服务器异常断电重启后,数据库会进行实例恢复,那么实例恢复的过程中Oracle做了什么操作呢?参考官网在这里做一下解释,菜鸟水平有限,欢迎勘正. 首先说下实例恢复的定义: Instance re ...

  8. 有了Jenkins,为什么还需要一个独立的部署系统

    需不需要一个独立的部署系统是很多企业用户在构建持续交付流程中经常困惑的一个问题.也经常有用户会问我们,现在已经有Jenkins,它自身提供了丰富的部署插件(如WebSphere部署插件.Tomcat部 ...

  9. 【多线程】死锁与Java栈跟踪工具

    今天面试有一道题,写一个死锁的程序,自己也是短路了,没写出来,回来写下. 死锁常见的情况是A线程持有a锁.阻塞于b锁,B线程持有b锁,阻塞于a锁,形成一个循环阻塞的状态. import java.ut ...

  10. Codeforces Round &num;349 &lpar;Div&period; 2&rpar;

    第一题直接算就行了为了追求手速忘了输出yes导致wa了一发... 第二题技巧题,直接sort,然后把最大的和其他的相减就是构成一条直线,为了满足条件就+1 #include<map> #i ...