2017-08-15 122 views
1

一直在研究解析相當多。隨着信息過多即時拍攝的JSON似乎沒有任何解釋如何在一個合理的方式做以提取與SWIFT 3.如何解析api的swift 3?

信息這是走到這一步,

func getBookDetails() { 


    let scriptUrl = "https://www.googleapis.com/books/v1/volumes?q=isbn:9781451648546" . 

    let myurl = URL(string:scriptUrl) 
    let request = NSMutableURLRequest(url: myurl!) 
    request.httpMethod = "GET" 

    let task = URLSession.shared.dataTask(with: myurl!) { (data, response, error) in 
     if error != nil{ 
     print("THIS ERROR",error!) 
      return 
     } else{ 
      if let mydata = data{ 
     do{ 
      let myJson = try (JSONSerialization.jsonObject(with: mydata, options: JSONSerialization.ReadingOptions.mutableContainers)) as AnyObject 

      // print("this is the MY JSON",myJson) ---> prints out the json 


      if let dictonary = myJson["items"] as AnyObject? { 
      print("the DICTONARY",dictonary) // ----> OUTPUT 
       if let dictonaryAA = dictonary["accessInfo"] as AnyObject? { 
        print("the accessInfo",dictonaryAA) 
       } 

      } 


     } catch{ 
      print("this is the in CATCH") 
       } 
      }  //data 
     } 
    } 
    task.resume() 
} 
} 



    OUTPUT : 


     the DICTONARY (
    { 
    accessInfo =   { 
     accessViewStatus = SAMPLE; 
     country = US; 
     ============= 
    RELEVANT DATA as in https://www.googleapis.com/books/v1/volumes? 
    q=isbn:9781451648546" 
    ========================== 
     title = "Steve Jobs"; 
    }; 
} 
) 

只需要通過JSON數據解析參考isbn獲得本書的名稱,作者和書名。 知道應該有更好的方式做的事情,是很容易理解的人新進入語言

+0

嘿,你會檢查此鏈接https://www.binpress.com/tutorial/swiftyjson-how-to-handle-json-in-swift/111 –

+0

@Dev_Tandel,它不完全是答案,但該鏈接提供了一些註釋,清除了一些關於JSON的查詢,謝謝 –

+0

我知道這不是所評論的答案。我認爲它可能會幫助你 –

回答

1

首先,所有JSON類型都是Swift 3中的值類型,因此最不具體的類型是Any,而不是AnyObject

其次,在JSON類型集中,字典([String:Any])和數組([Any],但大多數情況下爲[[String:Any]])只有兩種集合類型。 這不僅僅是Any也不是AnyObject

第三,給定的JSON不包含密鑰name


爲了方便起見,讓我們使用一個類型別名爲JSON詞典:

typealias JSONDictionary = [String:Any] 

根對象是一個字典,字典中的有字典的關鍵items陣列。並通沒有選項,.mutableContainers在Swift是無稽之談。

guard let myJson = try JSONSerialization.jsonObject(with: mydata) as? JSONDictionary, 
     let items = myJson["items"] as? [JSONDictionary] else { return } 

通過陣列迭代和爲titleauthors其是由方式的陣列提取值。這兩個值都在另一個字典中,用於鍵volumeInfo

for item in items { 
    if let volumeInfo = item["volumeInfo"] as? JSONDictionary { 
     let title = volumeInfo["title"] as? String 
     let authors = volumeInfo["authors"] as? [String] 
     print(title ?? "no title", authors ?? "no authors") 

的ISBN信息是在數組中的關鍵industryIdentifiers

  if let industryIdentifiers = volumeInfo["industryIdentifiers"] as? [JSONDictionary] { 
      for identifier in industryIdentifiers { 
       let type = identifier["type"] as! String 
       let isbn = identifier["identifier"] as! String 
       print(type, isbn) 
      } 
     } 
    } 
} 
0

你在這個行業

if let dictonaryAA = dictonary["accessInfo"] as AnyObject? 

因爲dictonary這裏是一個數組不是字典做錯了。它是一系列字典。爲了從該陣列中獲得第一個對象,首先使用dictonary[0],然後使用accessInfo key

我附上代碼爲您do

do{ 
     let myJson = try (JSONSerialization.jsonObject(with: mydata, options: JSONSerialization.ReadingOptions.mutableContainers)) as AnyObject 

     // print("this is the MY JSON",myJson) ---> prints out the json 


      if let array = myJson["items"] as AnyObject? { 
      print("the array",array) // ----> OUTPUT 
      let dict = array.object(at: 0) as AnyObject//Master Json 
      let accessInf = dict.object(forKey: "accessInfo") //Your access info json 
      print("the accessInfo",accessInf)                

    } 

} 

希望這有助於你。

+0

對於JSON對象的'AnyObject'在Swift中通常是錯誤的3 – vadian

+0

@vadian任何文檔或任何鏈接? –

+0

請閱讀https://developer.apple.com/swift/blog/?id=37,這是合乎邏輯的,因爲所有JSON類型都是Swift 3中的值類型。 – vadian

1

您可以分析在兩個方面

的API使用URLSession:使用

let rawDataStr: NSString = "data={\"mobile\":\"9420....6\",\"password\":\"56147180..1\",\"page_no\":\"1\"}" 
     self.parsePostAPIWithParam(apiName: "get_posts", paramStr: rawDataStr){ ResDictionary in 
//   let statusVal = ResDictionary["status"] as? String 
      self.postsDict = (ResDictionary["posts"] as! NSArray!) as! [Any] 
      print("\n posts count:",self.postsDict.count) 
     } 


    func parsePostAPIWithParam(apiName:NSString, paramStr:NSString,callback: @escaping ((NSDictionary) ->())) { 
     var convertedJsonDictResponse:NSDictionary! 
     let dataStr: NSString = paramStr 
     let postData = NSMutableData(data: dataStr.data(using: String.Encoding.utf8.rawValue)!) 
     let request = NSMutableURLRequest(url: NSURL(string: "http://13.12..205.248/get_posts/")! as URL, 
              cachePolicy: .useProtocolCachePolicy, 
              timeoutInterval: 10.0) 
     request.httpMethod = "POST" 
     request.allHTTPHeaderFields = nil 
     request.httpBody = postData as Data 
     let session = URLSession.shared 
     let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in 
      if (error != nil) { 
       print(error as Any) 
      } else { 
       let httpResponse = response as? HTTPURLResponse 
       print(httpResponse as Any) 
       do{ 
        if let convertedJsonIntoDict = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary { 
         convertedJsonDictResponse = convertedJsonIntoDict.object(forKey: apiName) as? NSDictionary 
         // callback for response 
         callback(convertedJsonDictResponse) 
        } 
       } catch let error as NSError { 
        print(error) 
       } 
      } 

Alamofire

   func AlamofirePOSTRequest() { 
     let urlString = "http://13.12..205.../get_posts/" 
     let para = ["data": "{\"mobile\":\"9420....6\",\"password\":\"56147180..1\",\"page_no\":\"1\"}"] 

     Alamofire.request(urlString, method: .post, parameters: para , headers: nil).responseJSON { 
      response in 
      switch response.result { 
      case .success: 
       print("response: ",response) 
       let swiftyJsonVar = JSON(response.result.value!) 
       if let resData = swiftyJsonVar["posts"].arrayObject { 
        self.postsDict = resData as! [[String:AnyObject]] 
       } 
       print("\n \n alomafire swiftyJsonVar: ",swiftyJsonVar) 
       break 
      case .failure(let error): 
       print(error) 
      } 
     } 
    } 
     }) 
     dataTask.resume()   
    }