【问题标题】:jq null unix timestamps parsing issuejq null unix时间戳解析问题
【发布时间】:2020-09-16 08:14:12
【问题描述】:

我正在尝试解析我使用 curl 接收到的大 json 文件。

通过关注this answer 我可以解析下一个文件:

$ cat test.json 
{"items": [{"id": 110, "date1": 1590590723, "date2": 1590110000, "name": "somename"}]}

使用下一个命令:

TZ=Europe/Kyiv jq -r '.[] | .[] | .name + "; " + (.date1|strftime("%B %d %Y %I:%M%p")) + "; " + (.date2|strftime("%B %d %Y %I:%M%p"))' test.json

输出是:

somename; May 27 2020 02:45PM; May 22 2020 01:13AM

但是当我尝试使用相同的命令解析下一个文件时:

$ cat test2.json 
{"items": [{"id": 110, "date1": 1590590723, "date2": null, "name": "somename"}]}

输出是:

jq: error (at test2.json:1): strftime/1 requires parsed datetime inputs

我可以在解析之前使用sed 将这些空值替换为一些有效值。但也许有更好的方法来跳过(忽略)这些值,在输出中留下空值:

somename; May 27 2020 02:45PM; null

【问题讨论】:

    标签: bash jq unix-timestamp strftime


    【解决方案1】:

    您可以调整您的 jq 程序,使其显示为:

    def tod: if type=="number" then strftime("%B %d %Y %I:%M%p") else tostring end;
    
    .[] | .[] | .name + "; " + (.date1|tod) + "; " + (.date2|tod)
    

    另一种选择是:

    def tod: (tonumber? | strftime("%B %d %Y %I:%M%p")) // null;
    
    .[] | .[] | "\(.name); \(.date1|tod); \(.date2|tod)"
    

    【讨论】:

    • 我建议将 jq 程序放在一个文件中(例如:program.jq)并使用 jq -r -f program.jq test.json 运行它。如果您仍然遇到问题,请说明导致问题的替代方案。
    猜你喜欢
    • 2016-08-19
    • 1970-01-01
    • 2020-05-27
    • 2012-04-17
    • 2021-06-07
    • 1970-01-01
    • 2017-02-20
    • 2014-09-19
    • 1970-01-01
    相关资源
    最近更新 更多