如何解析api的swift 3?

问题描述:

一直在研究解析相当多。随着信息过多即时拍摄的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

我知道这不是所评论的答案。我认为它可能会帮助你 –

首先,所有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) 
      } 
     } 
    } 
} 

你在这个行业

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

您可以分析在两个方面

的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()   
    }