【问题标题】:How to correctly parse a nested json string to a proper json?如何正确地将嵌套的 json 字符串解析为正确的 json?
【发布时间】:2018-01-23 07:38:58
【问题描述】:
"{\"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}"

上面是我从 websocket 得到的字符串。 当我使用以下方法将其解析为 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?

【问题讨论】:

    标签: ios json swift4 json-serialization


    【解决方案1】:

    解析 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...
        }
    

    然后您可以通过键访问字典中的所有数据并管理数据(如果您使用 Any 记得在使用它们之前输入正确的数据)。

    这里有一些文档:https://developer.apple.com/documentation/foundation/jsonserialization

    Swift 4 之后

    在 Swift 4 中引入了一个新类:JSONEncoder 和 JSONDecoder。 这太棒了,因为您可以创建模型,解析 json,然后您将获得一个所有字段都已填充的对象。 请注意,您的模型必须实现协议 Codable(或 Encodable 和 Decodable)。如果您的模型未实现该协议,您将收到错误消息。

    这里是一个例子:

    这是我的模型:

    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

    【讨论】:

      【解决方案2】:

      试试

      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 形式发布时,请告诉我任何更正

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        • 2016-02-21
        • 2019-11-04
        相关资源
        最近更新 更多