[英]How to correctly parse a nested json string to a proper json?
"{\"event\":\"posted\",\"data\":{\"channel_display_name\":\"\",\"channel_name\":\"e6webbgbt7gp8ryb4yyheiyrcw__jbk5semtk3dhjqzcoscu7g4yhe\",\"channel_type\":\"D\",\"mentions\":\"[\\\"jbk5semtk3dhjqzcoscu7g4yhe\\\"]\",\"post\":\"{\\\"id\\\":\\\"4fu4ey9fwfbyzndnz6brycmcry\\\",\\\"create_at\\\":1516692235168,\\\"update_at\\\":1516692235168,\\\"edit_at\\\":0,\\\"delete_at\\\":0,\\\"is_pinned\\\":false,\\\"user_id\\\":\\\"e6webbgbt7gp8ryb4yyheiyrcw\\\",\\\"channel_id\\\":\\\"6jc3md8ayfycxb87fqz63jphia\\\",\\\"root_id\\\":\\\"\\\",\\\"parent_id\\\":\\\"\\\",\\\"original_id\\\":\\\"\\\",\\\"message\\\":\\\"dd\\\",\\\"type\\\":\\\"\\\",\\\"props\\\":{},\\\"hashtags\\\":\\\"\\\",\\\"pending_post_id\\\":\\\"e6webbgbt7gp8ryb4yyheiyrcw:1516692235123\\\"}\",\"sender_name\":\"bibek\",\"team_id\":\"\"},\"broadcast\":{\"omit_users\":null,\"user_id\":\"\",\"channel_id\":\"6jc3md8ayfycxb87fqz63jphia\",\"team_id\":\"\"},\"seq\":9}"
上面是我從網絡套接字獲得的字符串。 當我使用以下方式將其解析為json時:
guard let data = text.data(using: .utf8) else {return}
let json = try? JSONSerialization.jsonObject(with: data, options: [])
我得到:
{
"event" : "posted",
"data" : {
"channel_display_name" : "",
"channel_name" : "e6webbgbt7gp8ryb4yyheiyrcw__jbk5semtk3dhjqzcoscu7g4yhe",
"sender_name" : "bibek",
"post" : "{\"id\":\"4fu4ey9fwfbyzndnz6brycmcry\",\"create_at\":1516692235168,\"update_at\":1516692235168,\"edit_at\":0,\"delete_at\":0,\"is_pinned\":false,\"user_id\":\"e6webbgbt7gp8ryb4yyheiyrcw\",\"channel_id\":\"6jc3md8ayfycxb87fqz63jphia\",\"root_id\":\"\",\"parent_id\":\"\",\"original_id\":\"\",\"message\":\"dd\",\"type\":\"\",\"props\":{},\"hashtags\":\"\",\"pending_post_id\":\"e6webbgbt7gp8ryb4yyheiyrcw:1516692235123\"}",
"channel_type" : "D",
"team_id" : "",
"mentions" : "[\"jbk5semtk3dhjqzcoscu7g4yhe\"]"
},
"seq" : 9,
"broadcast" : {
"channel_id" : "6jc3md8ayfycxb87fqz63jphia",
"omit_users" : null,
"user_id" : "",
"team_id" : ""
}
}
您會看到“ post”鍵仍然具有字符串值。 如何一槍將其轉換為json?
有兩種解析JSON的方法。
在Swift 4之前
在Swift 4之前,您只能使用JSONSerialization類(例如您的示例)。 此方法返回可以在Dictionary中強制轉換的Any對象(類型取決於您接收的數據)。
例如:
if let dict = try? JSONSerialization.jsonObject(with: data, options: []) as! Dictionary<String,String>{
do some stuff...
}
如果您有多種數據,則應使用以下強制轉換:
if let dict = try? JSONSerialization.jsonObject(with: data, options: []) as! Dictionary<String,Any?>{
do some stuff...
}
然后,您可以通過按鍵訪問字典中的所有數據並管理數據(如果使用“任何”,請記住在使用它們之前強制輸入正確的數據)。
這里是一些文檔: https : //developer.apple.com/documentation/foundation/jsonserialization
在Swift 4之后
在Swift 4中引入了一個新類:JSONEncoder和JSONDecoder。 太神奇了,因為您可以創建模型,解析json,然后將獲得一個對象,其中所有字段均已填充。 請注意,您的模型必須實現協議可編碼(或可編碼和可解碼)。 如果您的模型未實現該協議,則會出現錯誤。
這里是一個例子:
這是我的模型:
class myClass: Codable{
var Id: Int
var Identifier: String
var Alias: String
var Revision: Int
var Title: String
}
這是解析的代碼:
let decoder = JSONDecoder()
let myClass = try! decoder.decode(Questionario.self, from: (json?.data(using: .utf8))!)
現在,我的變量“ myClass”已經包含所有填充了json中數據的字段。
這里有一些文檔:
嘗試
let data = text.data(using: .utf8)
let json = try? JSONSerialization.jsonObject(with: data!, options: [])
if let value = json as? [String:AnyObject]{
if let dict = value["data"] as? NSDictionary{
let post = dict.value(forKey: "post") as? String
let data = post!.data(using: .utf8)
let json1 = try? JSONSerialization.jsonObject(with: data!, options: [])
print(json1!)
}
}
當我以JSON形式發帖時,請告知我任何更正
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.