2016-04-28 205 views
2

我得到了Json输入数据,我需要重新格式化从unix-time到ISO 8601的时间戳(以后处理文件)。 我试图通过使用: <input.json jq .[2].timestamp |= jq todate >output.json 这是以正确的方式重新格式化时间戳,但是如何将重新格式化的时间戳恢复到原始文件?我的目标是获取包含所有信息的原始文件,但重新格式化时间戳。重新格式化从unix到iso的时间戳

它的工作原理是我想在https://jqplay.org/,但不是在命令行。 我感谢您的帮助!

样品输入:

[ 
{ 
"channelId": 9088, 
"errorCode": 0, 
"value": 0, 
"timestamp": 1460258309 
}, 
{ 
"channelId": 10087, 
"errorCode": 0, 
"value": 1000, 
"timestamp": 1460258294 
}, 
{ 
"channelId": 10086, 
"errorCode": 0, 
"value": 90, 
"timestamp": 1460258294 
}, 
{ 
"errorCode": 0, 
"errorLine": "" 
} 
] 

通缉输出:

[ 
{ 
"channelId": 9088, 
"errorCode": 0, 
"value": 0, 
"timestamp": 2016-04-10T03:18:14Z 
}, 
{ 
"channelId": 10087, 
"errorCode": 0, 
"value": 1000, 
"timestamp": 2016-04-10T03:18:14Z 
}, 
{ 
"channelId": 10086, 
"errorCode": 0, 
"value": 90, 
"timestamp": 2016-04-10T03:18:14Z 
}, 
{ 
"errorCode": 0, 
"errorLine": "" 
} 
] 
+0

你能提供一个样本输入和预期的输出?另外,你可能的意思是做'jq'。[2] .timestamp | = todate'',也就是用单引号并且不需要额外的jq调用。 –

+0

增加了输入和预期输出。如果我跳过第二个'jq'cmd,我会得到命令拼写错误或无法找到的错误。这个问题是否有一个通用的解决方案?我总是遇到这个问题,当我尝试使用'|'时 –

回答

0

如果你想转换的 “时间戳” 的每次出现(不管它在哪里发生),那么如果你的JQ有walk/1你可以使用以下说明的过滤器:

jq -n '[{timestamp: (24*60*60)}] | walk(if type == "object" and .timestamp then .timestamp |= todate else . end)' 
[ 
    { 
    "timestamp": "1970-01-02T00:00:00Z" 
    } 
] 

如果你的jq没有hav Ëwalk/1,那么您可以复制从https://github.com/stedolan/jq/blob/master/src/builtin.jq

+0

对不起,但我不知道如何添加散步的定义,我只是使用jq的可执行文件* .exe版本。我在我的问题中添加了一个示例输入/输出。有没有办法解决这个问题而不增加散步? –

+0

要添加[走/ 1](https://github.com/stedolan/jq/blob/master/src/builtin.jq#L284-L291)(或任何功能),你可以把它的定义之前,其余的你的过滤器,例如jq -n'def walk(f):。作为$ in |如果键入==“object”,则将key_unsorted []作为$ key({};。+ {($ key):($ in [$ key | | walk(f))}}) f elif type ==“array”then map(walk(f))| f else f end; [{timestamp:(24 * 60 * 60)}] | (如果键入==“object”和.timestamp,那么.timestamp | = todate else。end)''。另一种方法是把它放在你的'〜/ .jq'文件中。 – jq170727

2

它的定义有了您的输入:

<input.json jq 'map(if .timestamp then .timestamp |= todate else . end)' 

输出为:

[ 
    { 
    "channelId": 9088, 
    "errorCode": 0, 
    "value": 0, 
    "timestamp": "2016-04-10T03:18:29Z" 
    }, 
    { 
    "channelId": 10087, 
    "errorCode": 0, 
    "value": 1000, 
    "timestamp": "2016-04-10T03:18:14Z" 
    }, 
    { 
    "channelId": 10086, 
    "errorCode": 0, 
    "value": 90, 
    "timestamp": "2016-04-10T03:18:14Z" 
    }, 
    { 
    "errorCode": 0, 
    "errorLine": "" 
    } 
]