【问题标题】:Converting timestamp object in json to timestamp as a string将json中的时间戳对象转换为字符串形式的时间戳
【发布时间】:2020-10-24 06:29:20
【问题描述】:

我有一个从 Mongodb 导出的 json。它以不同的格式显示时间戳 "timestamp":{"$date":"2020-08-01T00:00:00Z"}} 。我想将此时间戳对象转换为类似 "timestamp":"2020-08-01T00:00:00Z" 的字符串。

我已经使用像s/\{\"[$]date\":\"(\S{20})\"}/"\1"/g; 这样的 sed 完成了这项工作。但是,如果将毫秒添加到时间,则时间戳的长度可能会有所不同。例如:"timestamp":{"$date":"2020-08-01T00:00:00.123Z"}} 将转换为 s/\{\"[$]date\":\"(\S{23})\"}/"\1"/g;,因为时间戳字符串的长度为 23 个字符。我想将其转换为单个转换步骤,其中字符串的任何长度都可以。

我也可以用 jq 做到这一点,但这需要读取每一行,将值存储在变量中并使用 awk 来更改值。与 sed 相比,这将是耗时的。所以寻找不同的解决方案。

非常感谢一个好的答案。谢谢

【问题讨论】:

  • 使用 jq 解析/修改 JSON 数据。
  • jq 不进行就地编辑
  • jq ... INPUT | sponge INPUT
  • 普通的旧 jq ... INPUT > tmp && mv tmp INPUT 有什么问题?
  • @EdMorton -- 并发? (特别是如果您的字面意思是“tmp”。)

标签: json mongodb awk jq datetime-format


【解决方案1】:

考虑:

walk( if type == "object" and has("$date")
      then .["$date"] else . end )

这可能会丢失数据,因此您可能需要考虑类似的替代方案,例如更强的前提条件,或使用预期键名的前提条件。或者,如果“日期”对象与预期不符,您可能希望引发错误。

【讨论】:

  • walk 是一个 linux 工具,你能详细说明一下如何在命令中使用文件名等..
  • 更重要的是这将如何编辑文件,它与我在问题中所写的使用 jq 相同
  • 我的回答给出了一个 jq 解决方案。我回答中的walk 是一个jq 函数。
【解决方案2】:

我搞定了。此答案适用于那些正在寻找类似解决方案的人。

cat test.json | jq ' .location.timestamp = .location.timestamp."$date"' | sponge test.json

我不知道怎么用海绵,海绵很棒!

【讨论】:

  • 仅供参考:还有另一个用于 json 操作的 unix 工具 - jtc - 它和 jq 一样强大。 jtc 能够就地文件修改(因此您可以在一个命令中完成,无需管道到海绵)。例如,您在 jtc 中查询(使用就地文件修改)将如下所示:jtc -x'<timestamp>l:' -y[0] -y[0][-1] -sf test.json。 PS。我是jtc 的开发者。
猜你喜欢
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 2017-11-11
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多