[Swift]SwiftyJSON的使用:解析JSON


★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公眾號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/ 
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10709048.html 
➤如果鏈接不是山青詠芝的博客園地址,則可能是爬取作者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持作者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

用法

初始化Initialization

import SwiftyJSON
let json = JSON(data: dataFromNetworking)

或者

1 let json = JSON(jsonObject)

或者

1 if let dataFromString = jsonString.data(using: .utf8, allowLossyConversion: false) {
2     let json = JSON(data: dataFromString)
3 }

下標Subscript

 1 //從JSON數組中獲取Double
 2 let name = json[0].double
 3 //從JSON數組中獲取字符串數組
 4 let arrayNames =  json["users"].arrayValue.map {$0["name"].stringValue}
 5 //從JSON字典中獲取字符串
 6 let name = json["name"].stringValue
 7 //使用元素的路徑獲取字符串
 8 let path: [JSONSubscriptType] = [1,"list",2,"name"]
 9 let name = json[path].string
10 // 相同
11 let name = json[1]["list"][2]["name"].string
12 // 或者
13 let name = json[1,"list",2,"name"].string
14 //使用困難的方式
15 let name = json[].string
16 //使用自定義方式
17 let keys:[JSONSubscriptType] = [1,"list",2,"name"]
18 let name = json[keys].string

循環Loop

1 //如果json是.Dictionary
2 for (key,subJson):(String, JSON) in json {
3    // Do something you want
4 }

即使JSON是一個數組,第一個元素也總是一個String

1 //如果json是.Array 
2 // `index`是0 .. <json.count的字符串值
3 for (index,subJson):(String, JSON) in json {
4     // Do something you want
5 }

錯誤Error

SwiftyJSON 4.x

SwiftyJSON 4.x的引入稱為枚舉類型SwiftyJSONError,其中包括unsupportedTypeindexOutOfBoundselementTooDeepwrongTypenotExistinvalidJSON,在同一時間,ErrorDomain正在被更換SwiftyJSONError.errorDomain注意:這些舊的錯誤類型在SwiftyJSON 4.x中已棄用,將在以后的版本中刪除。

SwiftyJSON 3.x

使用下標來獲取/設置數組或字典中的值

如果JSON是:

  • 一個數組,應用程序可能會崩潰“索引越界”。
  • 一本字典,它將被nil無故分配
  • 不是數組或字典,應用程序可能會崩潰“無法識別的選擇器”異常。

這在SwiftyJSON中永遠不會發生。

 1 let json = JSON(["name", "age"])
 2 if let name = json[999].string {
 3     // Do something you want
 4 } else {
 5     print(json[999].error!) // "Array[999] is out of bounds"
 6 }
 7 
 8 let json = JSON(["name":"Jack", "age": 25])
 9 if let name = json["address"].string {
10     // Do something you want
11 } else {
12     print(json["address"].error!) // "Dictionary["address"] does not exist"
13 }
14 
15 let json = JSON(12345)
16 if let age = json[0].string {
17     // Do something you want
18 } else {
19     print(json[0])       // "Array[0] failure, It is not an array"
20     print(json[0].error!) // "Array[0] failure, It is not an array"
21 }
22 
23 if let name = json["name"].string {
24     // Do something you want
25 } else {
26     print(json["name"])       // "Dictionary[\"name"] failure, It is not an dictionary"
27     print(json["name"].error!) // "Dictionary[\"name"] failure, It is not an dictionary"
28 }

可選的getter

 1 // NSNumber
 2 if let id = json["user"]["favourites_count"].number {
 3    // Do something you want
 4 } else {
 5    // Print the error
 6    print(json["user"]["favourites_count"].error!)
 7 }
 8 
 9 // String
10 if let id = json["user"]["name"].string {
11    // Do something you want
12 } else {
13    // Print the error
14    print(json["user"]["name"].error!)
15 }
16 
17 // Bool
18 if let id = json["user"]["is_translator"].bool {
19    // Do something you want
20 } else {
21    // Print the error
22    print(json["user"]["is_translator"].error!)
23 }
24 
25 // Int
26 if let id = json["user"]["id"].int {
27    // Do something you want
28 } else {
29    // Print the error
30    print(json["user"]["id"].error!)
31 }
32 ...

非可選的getter

非可選的getter被命名 xxxValue

1 //如果不是Number或nil,則返回0
2 let id: Int = json["id"].intValue
3 //如果不是String或nil,則返回“”
4 let name: String = json["name"].stringValue
5 //如果不是數組或者為nil,則返回[]
6 let list: Array<JSON> = json["list"].arrayValue
7 //如果不是Dictionary或nil,返回[:]
8 let user: Dictionary<String, JSON> = json["user"].dictionaryValue

Setter

1 json["name"] = JSON("new-name")
2 json[0] = JSON(1)
3 json["id"].int =  1234567890
4 json["coordinate"].double =  8766.766
5 json["name"].string =  "Jack"
6 json.arrayObject = [1,2,3,4]
7 json.dictionaryObject = ["name":"Jack", "age":25]

原始對象Raw object

 1 let rawObject: Any = json.object
 2 let rawValue: Any = json.rawValue
 3 //將JSON轉換為原始NSData
 4 do {
 5     let rawData = try json.rawData()
 6   //Do something you want
 7 } catch {
 8     print("Error \(error)")
 9 }
10 //將JSON轉換為原始String
11 if let rawString = json.rawString() {
12   //Do something you want
13 } else {
14     print("json.rawString is nil")
15 }

存在Existence

1 //顯示是否在JSON中指定了值
2 if json["name"].exists()

文字敞篷車

有關文字敞篷車的更多信息:Swift Literal Convertibles

 1 // StringLiteralConvertible
 2 let json: JSON = "I'm a json"
 3 // IntegerLiteralConvertible 
 4 let json: JSON =  12345
 5 // BooleanLiteralConvertible
 6 let json: JSON =  true
 7 // FloatLiteralConvertible
 8 let json: JSON =  2.8765
 9 // DictionaryLiteralConvertible
10 let json: JSON =  ["I":"am", "a":"json"]
11 // ArrayLiteralConvertible
12 let json: JSON =  ["I", "am", "a", "json"]
13 //使用數組中的下標
14 var json: JSON =  [1,2,3]
15 json[0] = 100
16 json[1] = 200
17 json[2] = 300
18 json[999] = 300  //別擔心,什么都不會發生
19 //使用字典中的下標
20 var json: JSON =  ["name": "Jack", "age": 25]
21 json["name"] = "Mike"
22 json["age"] = "25" // It's OK to set String
23 json["address"] = "L.A." // Add the "address": "L.A." in json
24 //數組和字典
25 var json: JSON =  ["name": "Jack", "age": 25, "list": ["a", "b", "c", ["what": "this"]]]
26 json["list"][3]["what"] = "that"
27 json["list",3,"what"] = "that"
28 let path: [JSONSubscriptType] = ["list",3,"what"]
29 json[path] = "that"
30 //使用其他JSON對象
31 let user: JSON = ["username" : "Steve", "password": "supersecurepassword"]
32 let auth: JSON = [
33   "user": user.object, // use user.object instead of just user
34   "apikey": "supersecretapitoken"
35 ]

合並Merging

可以將一個JSON合並到另一個JSON中。將JSON合並到另一個JSON中會將所有非現有值添加到僅存在於otherJSON中的原始JSON。

如果兩個JSON都包含相同鍵的值,則大多數此值會被原始JSON覆蓋,但有兩種情況會提供一些特殊處理:

  • 如果兩個值都是值,那么JSON.Type.arrayotherJSON中找到的數組會附加到原始JSON的數組值。
  • 如果兩個值都是JSON.Type.dictionary兩個JSON值,那么合並的方式與封裝JSON的合並方式相同。

如果JSON中的兩個字段具有不同的類型,則該值將始終被覆蓋。

合並有兩種不同的方式:merge修改原始JSON,而merged在副本上非破壞性地工作。

 1 let original: JSON = [
 2     "first_name": "John",
 3     "age": 20,
 4     "skills": ["Coding", "Reading"],
 5     "address": [
 6         "street": "Front St",
 7         "zip": "12345",
 8     ]
 9 ]
10 
11 let update: JSON = [
12     "last_name": "Doe",
13     "age": 21,
14     "skills": ["Writing"],
15     "address": [
16         "zip": "12342",
17         "city": "New York City"
18     ]
19 ]
20 
21 let updated = original.merge(with: update)
22 // [
23 //     "first_name": "John",
24 //     "last_name": "Doe",
25 //     "age": 21,
26 //     "skills": ["Coding", "Reading", "Writing"],
27 //     "address": [
28 //         "street": "Front St",
29 //         "zip": "12342",
30 //         "city": "New York City"
31 //     ]
32 // ]

字符串表示

有兩種選擇:

  • 使用默認的Swift
  • 使用一個可以很好地處理選項的自定義表示nil"null"
1 let dict = ["1":2, "2":"two", "3": nil] as [String: Any?]
2 let json = JSON(dict)
3 let representation = json.rawString(options: [.castNilToNSNull: true])
4  // 表示為“{\”1 \“:2,\”2 \“:\”two \“,\”3 \“:null}”,表示{“1”:2,“2”:“two” “3”:空}

Alamofire合作

SwiftyJSON很好地包裝了Alamofire JSON響應處理程序的結果:

1 Alamofire.request(url, method: .get).validate().responseJSON { response in
2     switch response.result {
3     case .success(let value):
4         let json = JSON(value)
5         print("JSON: \(json)")
6     case .failure(let error):
7         print(error)
8     }
9 }

我們還提供了Alamofire的擴展,用於將NSData序列化為SwiftyJSON的JSON。

請參閱:Alamofire-SwiftyJSON

Moya合作

SwiftyJSON將數據解析為JSON:

 1 let provider = MoyaProvider<Backend>()
 2 provider.request(.showProducts) { result in
 3     switch result {
 4     case let .success(moyaResponse):
 5         let data = moyaResponse.data
 6         let json = JSON(data: data) //將網絡數據轉換為json
 7         print(json)
 8     case let .failure(error):
 9         print("error: \(error)")
10     }
11 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM