将json中的时间戳对象转换为字符串的时间戳

问题描述

我有一个从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相比,这将很耗时。因此,正在寻找其他解决方案。

一个好的答案将不胜感激。谢谢

解决方法

考虑:

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

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

,

我知道了。此答案适用于正在寻找类似解决方案的人。

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

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