json解析筆記

Json解析這裏主要是想說明一下options的作用

1.對象轉成jsonString : 進行轉化前爲了安全最好先判斷isValidJSONObject, 原因如下:
/// Generate JSON data from a Foundation object
let jsonObj1 = "這是數據" // 1.解析非集合對象options須有.fragmentsAllowed,否則奔潰
let jsonObj2 = [6] // 數組類型options不需要.fragmentsAllowed也能解析
let jsonObj3 = ["key":"value"] // 這種是正常的字典
let jsonObj4 = ["msg" : "haha!", 
                "data":["key":"value"],
            "fdasfds" :[12]] as [String : Any] // 不需要.fragmentsAllowed能解析
let jsonObj5 : Set = ["value1", "value2"] // 集合類型加什麼options都會奔潰

let bool1 = JSONSerialization.isValidJSONObject(jsonObj1) // false
let bool2 = JSONSerialization.isValidJSONObject(jsonObj2) // true
let bool3 = JSONSerialization.isValidJSONObject(jsonObj3)// true
let bool4 = JSONSerialization.isValidJSONObject(jsonObj4)// true
let bool5 = JSONSerialization.isValidJSONObject(jsonObj5)// false

let data = try? JSONSerialization.data(withJSONObject: jsonObj, 
options: [.prettyPrinted, // 1.打印美化,轉成字符串會自動加換行符和縮進
.sortedKeys, // 2.排序key
.fragmentsAllowed, // 3.允許非字典、非數組類型解析
.withoutEscapingSlashes])// 4.內容裏面包含斜杆"\"時不用添加斜杆轉義 

結論:

func getJSONStringFromDictionary(_ dictionary: Dictionary<AnyHashable, Any>) -> String {
    guard dictionary.count > 0, JSONSerialization.isValidJSONObject(dictionary) else {
        print("非有效json")
        return ""
    }
// options:參數根據上述的介紹自己選擇
    let data = try! JSONSerialization.data(withJSONObject: dictionary, options: [])
    let JSONString = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
    return JSONString! as String
}
2. jsonString轉成字典或者數組
let jsonString1 = "\"aaaa\"" // 要解析非鍵值對,需要option有.allowFragments
let jsonString2 = "[{\"key1\":\"value1\", \"key2\" : \"value2\"}, {\"key3\":\"value3\", \"key3\" : \"value3\"}]"// 能解析
let jsonString3 = "{\"key1\":\"value1\", \"key2\" : \"value2\"}"// 能解析
let jsonString4 = "{\"data\": [{\"key1\":\"value1\"}, {\"key2\" : \"value2\"}]}"// 能解析
let jsonString5 = "aaaaaa"// 非鍵值對或者非""裏面的字符串,解析都是空的
let jsonString = jsonString1
let jsonObj = getJsonObj(with: jsonString)

func getJsonObj(with jsonString: String) -> Any! {
    guard jsonString.count > 0 else {
        return nil
    }
    let data = jsonString.data(using: String.Encoding.utf8)!
    do {// 在jsonString1時,第一個有.allowFragments能解析,第二個會拋出異常
        let _ = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
        let _ = try JSONSerialization.jsonObject(with: data, options: [])
    } catch let error as NSError {
        print(error)
    }
    let jsonObj2 = try? JSONSerialization.jsonObject(with: data, options: [.mutableContainers, // 解析出來數組和字典是可變的
.mutableLeaves, // 解析出來的字符串是可變的
.allowFragments])// 允許不是鍵值對的單獨值
    let jsonObj = try? JSONSerialization.jsonObject(with: data, options: [])
    return jsonObj
}

結論:

func getJsonObj(with jsonString: String) -> Any! {
    guard jsonString.count > 0 else {
        return nil
    }
    let data = jsonString.data(using: String.Encoding.utf8)!
    let jsonObj = try? JSONSerialization.jsonObject(with: data, options: [])
    return jsonObj
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章