iOS 解析json或xml swift网络访问

假设现在请求北京的天气预报,已知API地址。

 

let session  = URLSession.shared 

let cityName = "北京" //参考 CoreLocation使用 链接:确定当前city位置)       

let urlString ="http://wthrcdn.etouch.cn/weather_mini?city=\(cityName)"

.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

 

        let url = URL(string: urlString!) 

        let task = session.dataTask(with: url!, completionHandler: {

            (data,responder,error) in 

            if error == nil{

                let str = String(data: data!, encoding: String.Encoding(rawValue: 4))

                print(str!)    //打印看看 

                // 一、如果是解析 JSON:

                let weatherInfo = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) asNSDictionary

//自己先打印看看原json数据啥样的 

                let dict1 = weatherInfo!["data"asNSDictionary

                let arr1 = dict1["forecast"asNSArray

                let dict2 = arr1[0asNSDictionary

                let infoStr = dict2["date"asString 

                print(infoStr)

 

                // 得到数据,用GCD去更新页面:关于GCD, 链接: 队列

                DispatchQueue.main.async {

                    // 主线程更新 UI

                }

            }

        })

        task.resume()   

 

   // 二、如果是解析 XML

// 假设url返回的是xml的数据,先给 ViewController 实现协议: xmlParser

 // 在刚才这句话:if error == nil {  后面 改成:

                 let xmlParser = NSXMLParser(data:data!)

                 xmlParser.delegate = self

                 xmlParser.parse()  // 解析.下面实现协议方法

                

 

     // xml是一步一步解析,json是全解析完了才用,返回数据较大时,选 xml

     //当前节点名,在成员中声明(不是在方法里):

     var currentNodeName:String!

     // 实现协议方法:

     func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { 

     currentNodeName = elementName 

     }

 

     //解析完成拿到节点真正的值

     func parser(_ parser: XMLParser, foundCharacters string: String) {      

//string表示节点值

     let newStr = string.trimmingCharacters(in: .whitespacesAndNewlines) 

     if newStr != "" {

         print("\(currentNodeName) -> \(newStr)") 

     }

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值