繁体   English   中英

如何正确地将嵌套的json字符串解析为适当的json?

[英]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中数据的字段。

这里有一些文档:

https://developer.apple.com/documentation/swift/codable

https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types

尝试

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM