Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可在json中使用随机元素进行编码_Json_Swift_Codable - Fatal编程技术网

可在json中使用随机元素进行编码

可在json中使用随机元素进行编码,json,swift,codable,Json,Swift,Codable,你能告诉我如何使用Сodable解析这种json吗 { "-MV_nbUZXH0YxpkMtdDK": { "log": "Installing dependencies", "ts": "2021-03-12T09:39:51.373513016Z" }, "-MV_nbUeK8yJbrTkyhku": { "log": "

你能告诉我如何使用С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收到的构建日志,我想在应用程序中显示它们。

我假设随机字符串的键不感兴趣,因此此解决方案只返回实际的日志记录

import Foundation
    
struct LogValue: Codable {
        let log, ts: String
}
    
typealias Logs = [String: LogValue]

let logs = try? JSONDecoder().decode(Logs, from: jsonData)
我选择使用自定义DateFormatter将时间戳转换为日期,但请注意,这有一个缺点,因为格式化程序只处理毫秒,因此会丢失一些精度,请参阅

下面是解码器如何配置以处理日期转换

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:开始恢复缓存的生成插件

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)
}