成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在Swift中優雅地處理JSON

移動開發 Android
因為Swift對于類型有非常嚴格的控制,它在處理JSON時是挺麻煩的,因為它天生就是隱式類型。SwiftyJSON是一個能幫助我們在Swift中使用JSON的開源類庫。開始之前,讓我們先看一下在Swift中處理JSON是多么痛苦。

SwiftyJSON的使用十分的簡單:

典型的NSURLSessionTask抓取Twitter的API將產生dataFromNetwork: NSData!:

你首先應該做的事情是初始化JSONValue:

  1. let json = JSONValue(dataFromNetwork) 

JSONValue是一個枚舉類型表示一個典型的JSON數據結構。

你能使用subscripts檢索不同的值從原始的JSONValue中,像這樣:

  1. let userName:JSONValue = json[0]["user"]["name"

注意userName仍然是一個JSONValue。那怎樣得到一個字符串呢?

你能用.string屬性得到JSON數據表示的真正值。

  1. let userNameString = userName.string! 

對每一種JSON類型, JSONValue都提供了一種屬性檢索它:

  1. var string: String? 
  2. var number: NSNumber? 
  3. var bool: Bool?  
  4. var array: Array<JSONValue>? 
  5. var object: Dictionary<String, JSONValue>? 

注意每一種屬性都是一個Optional值。這是因為JSON數據能包含任何它定義的有效類型。

因此,建議的方式是用Optional綁定檢索值:

  1. if let name = userName.string{ 
  2.     //This could avoid lots of crashes caused by the unexpected data types 
  3.   
  4. if let name = userName.number{ 
  5.     //As the value of the userName is Not a number. It won't execute. 

.number屬性產生一個NSNumber值,在Swift中這通常不是很有用。你能用.double或者.integer得到一個Double值或者一個Int值。

  1. if let intValue = numberValue.integer{ 
  2.     count += intValue 

枚舉(Enumeration)

在Swift中JSONValue實際上是一個枚舉:

  1. enum JSONValue { 
  2.   
  3.     case JNumber(NSNumber) 
  4.     case JString(String) 
  5.     case JBool(Bool) 
  6.     case JNull 
  7.     case JArray(Array<JSONValue>) 
  8.     case JObject(Dictionary<String,JSONValue>) 
  9.     case JInvalid(NSError) 
  10.   

你可以使用一個switch子句去更有效地獲取值:

  1. let json = JSONValue(jsonObject) 
  2. switch json["user_id"]{ 
  3. case .JString(let stringValue): 
  4.     let id = stringValue.toInt() 
  5. case .JNumber(let numberValue): 
  6.     let id = numberValue.integerValue 
  7. default
  8.     println("ooops!!! JSON Data is Unexpected or Broken"

下標(Subscripts)

注意,在JSON中一個數組結構被包裝成intoArray<JSONVlaue>,它意味著數組里的每一個元素都是一個JSONValue。甚至你從JSONValue中取出一個數組,你仍然可以使用基本的屬性去獲取元素的值:

  1. if let array = json["key_of_array"].array{ 
  2.     if let string = array[0].string{ 
  3.         //The array[0] is still a JSONValue! 
  4.     } 

對象也是一樣。因此,推薦的方式是訪問每一個數組和對象時使用JSONValue的下標。

  1. if let string = json["key_of_array"][0].string{ 
  2.   

實際上,你可以用下標訪問一個JSONValue,還不用擔心運行時錯誤導致的崩潰:

  1. let userName = json[99999]["wrong_key"

如果你使用推薦的方式去取數據,它是安全的:

  1. if let userName = json[99999]["wrong_key"]["name"].string{ 
  2.     //It's always safe 

打印

JSONValue遵守Printable協議.所以很容易在原始字符串中得到JSON數據:

  1. let json = JSONValue(dataFromNetwork) 
  2. println(json) 
  3. /*You can get a well printed human readable raw JSON string: 
  4.       { 
  5.         "url": { 
  6.           "urls": [ 
  7.             { 
  8.               "expanded_url": null, 
  9.               "url": "http://bit.ly/oauth-dancer", 
  10.               "indices": [ 
  11.                 0, 
  12.                 26 
  13.               ], 
  14.               "display_url": null 
  15.             } 
  16.           ] 
  17.        } 
  18. */ 

如果你不想打印出來,你可以使用.description屬性來得到上述字符串。

  1. let printableString = json.description 

調試與錯誤處理

要是JSON數據出錯或者我們錯誤地檢索數據,那會怎么樣呢?你可以使用if語句來測試:

  1. let json = JSONValue(dataFromNetworking)["some_key"]["some_wrong_key"]["wrong_name"] 
  2. if json{ 
  3.   //JSONValue it self conforms to Protocol "LogicValue", with JSONValue.JInvalid stands for false and others stands true 

如果我們嘗試使用錯誤的鍵值或索引來訪問數據,description屬性會高數你KeyPath在哪里出錯了.

  1. let json = JSONValue(dataFromNetworking)["some_key"]["some_wrong_key"]["wrong_name"
  2. if json{ 
  3.   
  4. else { 
  5.   println(json) 
  6.   //> JSON Keypath Error: Incorrect Keypath "some_wrong_key/wrong_name" 
  7.   //It always tells you where your key went wrong 
  8.   switch json{ 
  9.   case .JInvalid(let error): 
  10.     //An NSError containing detailed error information  
  11.   } 

后記

 SwiftyJSON的開發將會發布在Github, 請持續關注后續版本。

本文鏈接:http://mobile.51cto.com/design-446157.htm

責任編輯:chenqingxiang 來源: oschina
相關推薦

2025-01-20 07:10:00

LambdaJavanull

2024-05-21 08:14:59

代碼接口依賴注入

2023-05-12 12:09:38

職責鏈模式客服

2024-09-26 10:51:51

2024-01-15 08:09:44

Fluent錯誤代碼

2023-08-29 07:35:15

2024-10-14 11:08:53

程序異常延遲

2025-02-07 09:11:04

JSON對象策略

2025-04-29 08:15:00

超大文件流式 + yield日志

2022-08-03 08:41:30

客戶端操作并發請求

2024-05-20 08:06:42

ASP接口服務

2021-10-26 10:28:41

開發架構Kubernetes

2025-02-13 09:02:04

2009-12-11 17:39:47

VS 2008數據

2017-04-12 11:16:08

Python終端編程

2014-07-04 09:47:24

SwiftSwift開發

2019-03-11 09:18:20

Java 8Stream數據結構

2022-06-27 09:00:55

SwiftGit Hooks

2019-12-25 10:55:00

安全數據安全互聯網

2023-10-05 12:43:48

數據處理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久国产精品免费免费 | 久久久久国产精品一区二区 | 日韩在线精品强乱中文字幕 | 99在线视频观看 | 久久91精品久久久久久9鸭 | 欧美一区二区三区视频 | 国产激情亚洲 | 日韩网站在线观看 | 欧美午夜一区 | 北条麻妃国产九九九精品小说 | 日韩一区二区三区在线看 | 作爱视频免费观看 | 国产日韩欧美精品一区二区三区 | 91精品国产一区二区三区蜜臀 | 国产中文字幕在线 | 51ⅴ精品国产91久久久久久 | 亚洲精品久久久久久一区二区 | 97日韩精品| 91精品国产综合久久久久久蜜臀 | av一区二区在线观看 | 欧美电影在线观看网站 | 激情国产| 国产精品视频一二三区 | 成人免费网站www网站高清 | 日韩在线播放第一页 | 99久久国产综合精品麻豆 | 草草视频在线观看 | 欧美日韩中文字幕在线 | 伊人艹 | 91视在线国内在线播放酒店 | 国产我和子的乱视频网站 | 在线欧美一区 | 不卡的av在线 | 久久精品99 | 91久久精品国产91久久 | 久久99精品久久久久久秒播九色 | 国产偷自视频区视频 | 黄网在线观看 | 在线免费观看成人 | 黄色大片免费播放 | 日韩国产高清在线观看 |