如何解决操作 JSON 对象的时间戳
{
"logs": [
{
"timestamp": "20181216T14:36:12","description": "IP connectivity via interface ipmp1 has become degraded.","type": "alert","uuid": "1234567","severity": "Minor"
},{
"timestamp": "20181216T14:38:16","description": "Network connectivity via port ibp4 has been established.","uuid": "12345678","severity": "Minor"
}
]
}
我有这个 JSON 对象,我想遍历每个对象并将时间戳更新为更具可读性的日期。现在,我有
$currentLogs.logs |
Where{$_.type -eq 'alert'} |
ForEach{$_.timestamp = {[datetime]::parseexact($_.timestamp,'yyyyMMdd\THH:mm:ss',$null)}}
但是当我读取对象 $currentLogs 时,它仍然没有更新。
解决方法
您需要首先解析您的日期/时间,然后应用您想要的格式。如果您不应用任何格式,那么 timestamp
属性将是一个 datetime
对象类型,并且转换回 JSON 会对它进行奇怪的格式设置。最好将您的新格式设置为字符串,以便 JSON 序列化不会对其进行操作:
$currentLogs.logs | Where type -eq 'alert' | ForEach-Object {
$_.timestamp = [datetime]::parseexact($_.timestamp,'yyyyMMddTHH:mm:ss',$null).ToString('yyyy-MM-dd HH:mm:ss')
}
在您的尝试中,您使用了以下代码:
{[datetime]::parseexact($_.timestamp,'yyyyMMdd\THH:mm:ss',$null)}
使用周围的 {}
表示脚本块。如果该脚本块没有被调用或调用,它只会逐字输出其内容。您可以在控制台中运行上述代码并查看结果。
您也没有在解析尝试后格式化您的 datetime
对象。默认情况下,当 ToString()
值设置为属性时,控制台中的输出将隐式应用 datetime
,但该隐式格式不会转换为您的 JSON 转换(无论出于何种原因)。>
感谢您显示所需的格式。
要更新“type”等于“alert”的元素,您可以这样做:
localStorage
如果您想保存到文件,请在上面最后一行附加 $json = @'
{
"logs": [
{
"timestamp": "20181216T14:36:12","description": "IP connectivity via interface ipmp1 has become degraded.","type": "alert","uuid": "1234567","severity": "Minor"
},{
"timestamp": "20181216T14:38:16","description": "Network connectivity via port ibp4 has been established.","uuid": "12345678","severity": "Minor"
}
]
}
'@ | ConvertFrom-Json
# find the objects with 'type' equals 'alert'
$json.logs | Where-Object { $_.type -eq 'alert' } | ForEach-Object {
# parse the date in its current format
$date = [datetime]::ParseExact($_.timestamp,$null)
# and write back with the new format
$_.timestamp = '{0:yyyy-MM-dd HH:mm:ss}' -f $date
}
# convert back to json
$json | ConvertTo-Json
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。