#66 - XML/JSON

//********************************************************************
//********************************************************************
//******************************* Data *******************************
//********************************************************************
//********************************************************************

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var myImageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        let webAddress = "https://maps.googleapis.com/maps/api/place/details/json?placeid=ChIJBfD1iPyLGGARiEmE6krSBf0&fields=name,rating,formatted_phone_number&key=AIzaSyAXGXGti9x6lICJBBsNt0JtpOuFOFbaFHo" //想要連結的網址
        let webURL = URL(string: webAddress)     //用網址產生URL
        if let url = webURL{            //如果真的可以轉換成URL的話
            DispatchQueue.global().async {   //到背景執行佇列去下載
                do{
                    
                    //用這行程式碼下載,下載到的資料存在常數downloadedData中
                    let downloadedData = try Data(contentsOf: url)
                    
                    
                    let json = try JSONSerialization.jsonObject(with: downloadedData, options: [])
                    //整包資料是一個字典,所以轉型成字典
                    //print(json)
                    
                    if let jsonDict = json as? [String:Any]
                    {
                        //用results這個key,拿到的資料是一個陣列,這個陣列裡面是一個字典
                        
                        //如果result是陣列形式result[],則轉型時需要多加一組[]
                        //if let jsonArray = jsonDict["result"] as? [[String:Any]]
                        
                        //如果result是字典形式而已,則轉型時不需要再多一組[]
                        if let jsonArray = jsonDict["result"] as? [String:Any]{
                        
                            //找到陣列第零個成員,用name這個key,找到儲存名字的字典
                            //用first與last這兩個key,拿到相關的資料,取得全名。
                            //let jsonName = jsonArray[0]["name"]   //如果result是陣列形式
                            
                            let jsonName = jsonArray["name"]
                            print("地區:\(jsonName!)")
                            //找到陣列第零個成員,用age這個key,找到年紀
                            //let jsonRating = jsonArray[0]["rating"]   //如果result是陣列形式
                            
                            let jsonRating = jsonArray["rating"]
                            print("評分:\(jsonRating!)")
                        }
                    }
                    
                    //下載到的資料可能是文字、html、JSON、XML,或是圖片等資料
                    /* 如果下載的資料是字串的話,請用下面的程式碼來處理
                    guard let downloadedString = NSString(
                        data: downloadedData,
                        encoding: String.Encoding.utf8.rawValue) else{
                            return
                    }
                    print(downloadedString) //downloadString是下載的字串
                    */
                    
                    //如果下載的資料是圖片的話,請用下面的程式碼處理
                    //用下載的資料產生UIImage
                    /*let downloadedImage = UIImage(data:downloadedData)
                    //到主佇列更新圖片
                    DispatchQueue.main.async {
                        self.myImageView.image = downloadedImage
                    }*/
                }catch{
                    print("下載發生錯誤")
                }
            }
        }
    }
}



JSON Data形式(注意 result為字典非陣列)
-------------------------------------
有多層資料的JSON較複雜,需判斷是否有陣列或純粹是字典,再用let,as?[String:Any]的方式一層一層指定變數 
//********************************************************************
//********************************************************************
//******************************* Data *******************************
//********************************************************************
//********************************************************************

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var myImageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        let webAddress = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=24.985175,121.440307&radius=5000&type=restaurant&keyword=%E9%A4%90%E5%BB%B3&next_page_token=%22CrQCKwEAADOqVIbft3Mibl9jTSjf0ge_b5rXgEulALABQCBIVGHQQzFaQlzfskH4tpftbORm-9InrFz9oKEB0k-1qkXNWHsmL15Coku53bGkh1D278azqkVzeLVSXPvGQ_2MSf6DEzrlB4twdWUDBiEVmQrwAmNV_pGxpAVWsCbUG5oTQ4qs60-DusN9enxwTqE2vw0Rob27rzEgA1os6pjlK7U6NfHUJqOK1TJuRZk_obGJtu5j4z-fqnfvh9uMsydz0L7-M2ayeQg54cBFMhCdMhr-AtOM0m48FlDSXedtgJgMigk9VMfr6kP0tzfEWMHEOdJwsjYGVCcYiKDEfhhDpQOg5-s8zjPZEnGONeUZjYUZrI_SJvD7_IFQodRMb3bpsFSSKqiZob-FrdJS3IGDQKrynBASEBZct2lbhWKn6yLnuN6z2G8aFEqpgD1FUac0aGRt62fnr3CRlxLP%22&key=AIzaSyAXGXGti9x6lICJBBsNt0JtpOuFOFbaFHo" //想要連結的網址
        let webURL = URL(string: webAddress)     //用網址產生URL
        if let url = webURL{            //如果真的可以轉換成URL的話
            DispatchQueue.global().async {   //到背景執行佇列去下載
                do{
                    
                    //用這行程式碼下載,下載到的資料存在常數downloadedData中
                    let downloadedData = try Data(contentsOf: url)
                    
                    
                    let json = try JSONSerialization.jsonObject(with: downloadedData, options: [])
                    //整包資料是一個字典,所以轉型成字典
                    //print(json)
                    
                    if let jsonDict = json as? [String:Any]
                    {
                        //用results這個key,拿到的資料是一個陣列,這個陣列裡面是一個字典
                        
                        //如果result是陣列形式result[],則轉型時需要多加一組[]
                        //if let jsonArray = jsonDict["result"] as? [[String:Any]]
                        
                        //如果result是字典形式而已,則轉型時不需要再多一組[]
                        if let jsonArray = jsonDict["results"] as? [[String:Any]]{
                        
                            //找到陣列第零個成員,用name這個key,找到儲存名字的字典
                            //用first與last這兩個key,拿到相關的資料,取得全名。
                            //let jsonName = jsonArray[0]["name"]   //如果result是陣列形式
                            if let geoArray = jsonArray[0]["geometry"] as?[String:Any]
                            {
                            //let jsonName = jsonArray[1]["geometry"]
                                let jsonName = geoArray["location"] as?[String:Any]
                                let jsonlat = jsonName?["lat"]
                            print("地區:\(jsonlat!)")
                                
                            //找到陣列第零個成員,用age這個key,找到年紀
                            //let jsonRating = jsonArray[0]["rating"]   //如果result是陣列形式
                            }
                            let jsonRating = jsonArray[1]["rating"]
                            print("評分:\(jsonRating!)")
                        }
                    }
                    
                    //下載到的資料可能是文字、html、JSON、XML,或是圖片等資料
                    /* 如果下載的資料是字串的話,請用下面的程式碼來處理
                    guard let downloadedString = NSString(
                        data: downloadedData,
                        encoding: String.Encoding.utf8.rawValue) else{
                            return
                    }
                    print(downloadedString) //downloadString是下載的字串
                    */
                    
                    //如果下載的資料是圖片的話,請用下面的程式碼處理
                    //用下載的資料產生UIImage
                    /*let downloadedImage = UIImage(data:downloadedData)
                    //到主佇列更新圖片
                    DispatchQueue.main.async {
                        self.myImageView.image = downloadedImage
                    }*/
                }catch{
                    print("下載發生錯誤")
                }
            }
        }
    }
}




留言