【问题标题】:Codable with random elements in json可在 json 中使用随机元素进行编码
【发布时间】:2021-03-12 12:57:08
【问题描述】:

你能告诉我如何使用Сodable解析这种json吗?

{
"-MV_nbUZXH0YxpkMtdDK": {
    "log": "Installing dependencies",
    "ts": "2021-03-12T09:39:51.373513016Z"
},
"-MV_nbUeK8yJbrTkyhku": {
    "log": "Python version set to 2.7",
    "ts": "2021-03-12T09:39:51.376706383Z"
},
"-MV_nbnKj7ooihytbFb_": {
    "log": "Downloading and installing node v10.24.0...",
    "ts": "2021-03-12T09:39:52.640846883Z"
},
"-MV_nbr6_lCOgmASvjIx": {
    "log": "Downloading https://nodejs.org/dist/v10.24.0/node-v10.24.0-linux-x64.tar.xz...",
    "ts": "2021-03-12T09:39:52.882689552Z"
},
"-MV_nbx-xDFgKY5gt7LW": {
    "log": "Computing checksum with sha256sum",
    "ts": "2021-03-12T09:39:53.257948857Z"
},
"-MV_nbyq7zFzPKlZoUUW": {
    "log": "Checksums matched!",
    "ts": "2021-03-12T09:39:53.370929002Z"
},
"-MV_ncWPSrcJTxwRO-9Y": {
    "log": "Now using node v10.24.0 (npm v6.14.11)",
    "ts": "2021-03-12T09:39:55.588474395Z"
},
"-MV_ncXt4WBTobLQWtsP": {
    "log": "Started restoring cached build plugins",
    "ts": "2021-03-12T09:39:55.684040489Z"
}

我无法理解这些名称的模式) 这是从 Google 收到的构建日志,我想在应用程序中显示它们。

【问题讨论】:

    标签: json swift codable


    【解决方案1】:
    import Foundation
        
    struct LogValue: Codable {
            let log, ts: String
    }
        
    typealias Logs = [String: LogValue]
    
    let logs = try? JSONDecoder().decode(Logs, from: jsonData)
    

    【讨论】:

      【解决方案2】:

      我假设键(随机字符串)是不感兴趣的,所以这个解决方案只返回实际的日志记录。

      我选择使用自定义DateFormatter 将时间戳转换为Date,但请注意,这样做有一个缺点,因为格式化程序只处理毫秒,因此会丢失一些精度,请参阅this question

      struct LogRecord: Decodable {
          let log: String
          let timestamp: Date
      
          enum CodingKeys: String, CodingKey {
              case log
              case timestamp = "ts"
          }
      }
      

      这是解码器如何配置来处理日期转换

      let dateFormatter = DateFormatter()
      dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
      
      let decoder = JSONDecoder()
      decoder.dateDecodingStrategy = .formatted(dateFormatter)
      

      这里是解码,我只保留解码字典中的值

      do {
          let logs = try decoder.decode([String: LogRecord].self, from: data).values
          for log in logs.sorted(by: { $0.timestamp < $1.timestamp }) {
              print("\(dateFormatter.string(from: log.timestamp)): \(log.log)")
          }
      } catch {
          print(error)
      }
      

      输出

      2021-03-12T10:39:51.373+0100:安装依赖项
      2021-03-12T10:39:51.376+0100:Python 版本设置为 2.7
      2021-03-12T10:39:52.640+0100:下载并安装节点 v10.24.0...
      2021-03-12T10:39:52.882+0100:正在下载 nodejs.org/dist/v10.24.0/node-v10.24.0-linux-x64.tar.xz...
      2021-03-12T10:39:53.257+0100:使用 sha256sum 计算校验和
      2021-03-12T10:39:53.370+0100:校验和匹配!
      2021-03-12T10:39:55.588+0100:现在使用节点 v10.24.0 (npm v6.14.11)
      2021-03-12T10:39:55.684+0100:开始恢复缓存的构建插件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多