導航:首頁 > 編程語言 > 本地json數據解析swift

本地json數據解析swift

發布時間:2025-04-07 06:29:06

⑴ 如何在 Swift 中優雅地處理 jsON

JSON數據轉換
Perfect通過一系列Swift自建數據類型的擴展實現了基本的JSON編碼和解碼工具。解碼是通過在Swift字元串類型基礎上實現的擴展。

Perfect 的JSON函數庫是開源的,請查看這里下載並安裝Perfect對Swift JSON的支持:

https://github.com/PerfectlySoft/Perfect/

請注意雖然Perfect的JSON工具功能強大,但對您的系統而言不是必須的,請根據需要自行選擇引用該工具庫內的函數。
如果需要使用本系統,請首先在您的源代碼開始部分確保PerfectLib庫函數已經聲明導入:
import PerfectLib

將數據編碼為JSON格式
您可以將以下數據類型直接轉換為JSON字元串:
String 字元串
Int 整型
UInt 無符號整型
Double 雙精度浮點型
Bool 布爾型
Array 任意類型的數組
Dictionary 以字元串為關鍵詞的字典
Optional 可選類型
從JSONConvertibleObject對象繼承而來的定製類型
⚠️注意⚠️對於可選類型而言,只有包含上述任意一種類型的Optional類型才是可以直接轉換的。對於值為nil的Optionals類型來說,JSON字元串輸出結果將會是"null"。
為了實現上述變數類型的編碼,請調用上述對象的jsonEncodedString()函數。這個函數是Perfect專門做的擴展。該函數有可能會拋出JSONConversionError.notConvertible無法轉換的異常。
舉例
let scoreArray: [String:Any] = ["第一名": 300, "第二名": 230.45, "第三名": 150]
let encoded = try scoreArray.jsonEncodedString()

編碼結果是如下字元串:
{"第二名":230.45,"第一名":300,"第三名":150}

解碼JSON數據
包含JSON格式數據的字元串可以用jsonDecode()函數解碼。如果格式有問題,該函數會拋出JSONConversionError.syntaxError語法錯誤異常。
let encoded = "{\"第二名\":230.45,\"第一名\":300,\"第三名\":150}"
let decoded = try encoded.jsonDecode() as? [String:Any]

對上述字元串的解碼將會生成下列內容的字典類型:
["第二名": 230.44999999999999, "第一名": 300, "第三名": 150]

由於解碼JSON字元串可能產生任意數據值,因此最常見的方法是用JSON對象(字典)或者數組進行處理。您需要根據結果自行按照預期類型進行轉換。
解碼後的數據使用
因為解碼後的結果總是[String:Any]字典或者[Any]數組,因此您需要其包含的數據轉換為預期類型,比如:
var firstPlace = 0
var secondPlace = 0.0
var thirdPlace = 0

let encoded = "{\"第二名\":230.45,\"第一名\":300,\"第三名\":150}"
guard let decoded = try encoded.jsonDecode() as? [String:Any] else {
return
}

for (key, value) in decoded {
switch key {
case "第一名":
firstPlace = value as! Int
case "第二名":
secondPlace = value as! Double
case "第三名":
thirdPlace = value as! Int
default:
break
}
}

print("前三名:\r" + "第一名" + "\(firstPlace)" + " 分\r" + "第二名:" + "\(secondPlace)" + " 分\r" + "第三名:" + "\(thirdPlace)" + " 分")

輸出結果為:
前三名:
第一名:300分
第二名:230.45分
第三名:150分

從JSON數據中解碼空值
由於JSON的空值是沒有類型的,系統會將空值替換為一個JSONConvertibleNull對象。比如:
let jsonString = "{\"第一名\":300,\"第四名\":null,\"第二名\":230.45,\"第三名\":150}"

if let decoded = try jsonString.jsonDecode() as? [String:Any] {
for (key, value) in decoded {
if let value as? JSONConvertibleNull {
print("欄位\"\(key)\"為空值")
}
}
}

輸出為:
欄位"第四名"為空值

可轉換為JSON的對象
Perfect的JSON轉換工具庫提供為定製類的編碼解碼功能。只要從JSONConvertibleObject基類繼承即可,如下示例:
/// 從基類繼承為一個可以轉化為JSON格式的定製對象。
public class JSONConvertibleObject: JSONConvertible {
/// 默認構造函數
public init() {}
/// 獲得JSON鍵/值
public func setJSONValues(_ values:[String:Any]) {}
/// 根據JSON鍵/值設置對象屬性。
public func getJSONValues() -> [String:Any] { return [String:Any]() }
/// 將對象編碼為JSON文本
public func jsonEncodedString() throws -> String {
return try self.getJSONValues().jsonEncodedString()
}
}

任何需要使用JSON編解碼的對象都首先要將該對象注冊到系統中去。注冊工作需要在您的應用程序啟動時完成。調用JSONDecoding.registerJSONDecodable函數完成對象注冊。該函數定義如下:
public class JSONDecoding {
/// 該函數為基於JSON成員數據定製對象返回一個新的實例。
public typealias JSONConvertibleObjectCreator = () -> JSONConvertibleObject
static public func registerJSONDecodable(name: String, creator: JSONConvertibleObjectCreator)
}

注冊對象是需要一個唯一的命名。同樣還需要一個creator函數用於在需要時創建一個新的對象實例。
當系統對一個JSONConvertibleObject對象編碼時,會調用對象的getJSONValues函數。該函數會返回一個[String:Any]字典,該字典包含了用於給這個對象編碼的所有的欄位和屬性值。這個字典必須要包含一個聲明其對象類型的欄位。而這個類型欄位的值也 必須 是與該對象在程序開始階段注冊的名稱一致的名字。對應該屬性值的欄位由JSONDecoding.objectIdentifierKey屬性而定。
當系統解碼這樣一個對象時,系統會首先尋找JSONDecoding.objectIdentifierKey值,然後在查找之前注冊的對象creator構造函數。隨後系統會根據這個類型和構造函數自動創建一個新對象並調用setJSONValues(_ values:[String:Any]) 函數設置各欄位值。調用該函數會用一個包含所有解碼數據的字典作為參數傳遞過去。這些屬性值會與之前由getJSONValues編碼函數返回的內容進行匹配。在setJSONValues函數中,對象會恢復所有屬性與數據。
下面的例子演示了如何定義一個定製的JSONConvertibleObject對象,以及如何將其轉換為一個JSON字元串。然後再進行解碼並與原對象進行比較。⚠️注意⚠️在本例子中對象通過調用getJSONValue函數直接把一個命名欄位的屬性值從字典中抽取出來,而且允許在字典內不包含指定欄位的情況下返回一個默認值。
該例子分成了以下幾個部分逐一說明。
類定義
class User: JSONConvertibleObject {
static let registerName = "user"
var firstName = ""
var lastName = ""
var age = 0
override func setJSONValues(_ values: [String : Any]) {
self.firstName = getJSONValue(named: "firstName", from: values, defaultValue: "")
self.lastName = getJSONValue(named: "lastName", from: values, defaultValue: "")
self.age = getJSONValue(named: "age", from: values, defaultValue: 0)
}
override func getJSONValues() -> [String : Any] {
return [
JSONDecoding.objectIdentifierKey:User.registerName,
"firstName":firstName,
"lastName":lastName,
"age":age
]
}
}

注冊定義好的類信息
// 運行一次即可
JSONDecoding.registerJSONDecodable(name: User.registerName, creator: { return User() })

對象編碼:
let user = User()
user.firstName = "Donnie"
user.lastName = "Darko"
user.age = 17

let encoded = try user.jsonEncodedString()

編碼後的數據看起來像這樣:
{"lastName":"Darko","age":17,"_jsonobjid":"user","firstName":"Donnie"}

對象解碼:
guard let user2 = try encoded.jsonDecode() as? User else {
return // 出錯
}

// 驗證屬性值是否一致
XCTAssert(user.firstName == user2.firstName)
XCTAssert(user.lastName == user2.lastName)
XCTAssert(user.age == user2.age)

JSON轉換錯誤
在JSON編碼解碼過程中,系統可能會拋出一個JSONConversionError轉換異常,定義如下:
/// 在JSON編解碼過程中可能發生的錯誤異常。
public enum JSONConversionError: ErrorProtocol {
/// 對象不支持JSON轉換。
case notConvertible(Any)
/// 提供的欄位不是字元串。
case invalidKey(Any)
/// JSON文本內由語法錯誤。
case syntaxError
}

⑵ json-swift和SwiftyJSON有什麼對比性

json-swift和SwiftyJSON都使用了一個自定義的枚舉類型來描述JSON數據;通過重載實現了類似Array和Dictionary的下標操作;並可以將NSData類型的json實例轉換成其對應的枚舉類型的實例。

閱讀全文

與本地json數據解析swift相關的資料

熱點內容
有沒好的sdh教程 瀏覽:980
js中new 瀏覽:482
匯好物app怎麼下載 瀏覽:418
java在桌面創建文件 瀏覽:115
軟體技術代碼編程怎麼學 瀏覽:382
在哪裡找拷貝的文件 瀏覽:843
c的編程軟體哪個好 瀏覽:638
湯app叫什麼 瀏覽:80
linux快速生成1t文件 瀏覽:156
百度雲下載破解一行js代碼 瀏覽:791
辦低保先在哪裡查大數據 瀏覽:225
cad斷電後怎麼找迴文件 瀏覽:175
數學編程軟體有哪些內容 瀏覽:169
網吧游戲文件在哪裡找 瀏覽:959
地下城目錄的應用程序 瀏覽:838
linux下c可執行文件調試 瀏覽:917
佛山哪裡有大數據精準營銷簡訊價格 瀏覽:205
怎麼將文件掃描到電腦上 瀏覽:487
java讀文件一行多個數據 瀏覽:441
哪裡可以找到app推廣員的工作 瀏覽:340

友情鏈接