在Powershell7.2中,JSON反序列化为对象的方式似乎有了变化-->而不是字符串,现在是DateTime。但我希望具有“旧”行为,即将其作为字符串而不是DateTime处理。
在Powershell7.2中使用ConvertFrom-Json时,如何将所有日期反序列化为字符串而不是日期时间?
编辑:
$val = '{ "date":"2022-09-30T07:04:23.571+00:00" }' | ConvertFrom-Json
$val.date.GetType().FullName
4条答案
按热度按时间qvtsj1bj1#
这实际上是一个已知问题,请参阅:
#13598
Add a -DateKind parameter to ConvertFrom-Json to control how System.DateTime / System.DateTimeOffset values are constructed。然而,我认为这个问题没有简单的解决方案。你可以做的一件事就是调用(Windows)PowerShell。它目前也不是直接向前的,因此我创建了一个小 Package 来在PowerShell会话之间发送和接收复杂对象(另请参阅我的#18460 Invoke-PowerShell
目的):用途:
更新
正如**mklement0**所评论的那样,我显然将答案复杂化了。
通过Powershell.exe调用是一种实用的解决办法(尽管速度很慢且仅适用于Windows),但请注意,您不需要帮助器函数:如果您从PowerShell向Powershell.exe(或pwsh.exe)传递脚本块,基于Based64 CLIXML的序列化将在后台自动发生:出于这个原因,尝试
powershell.exe -noprofile { $args | ConvertFrom-Json } -args '{ "date":"2022-09-30T07:04:23.571+00:00" }'
,我认为不需要Invoke-PowerShell cmdlet。des4xlb02#
powershell.exe
提供了一个实用的解决方案,基于ConvertFrom-Json
没有不自动将类似ISO 8601的时间戳字符串转换为[datetime]
示例。powershell.exe
解决方法有两个缺点:(A)它很慢(必须在子进程中启动单独的PowerShell示例),以及(B)它仅在Windows上运行。下面的解决方案是您自己避免这些问题的方法的概括。以下是your own in-process approach的推广:
"
0"`)-假设输入本身从不包含这样的字符,这是公平的假设。ConvertFrom-Json
识别时间戳字符串,并使其保持不变。ConvertFrom-Json
输出的[pscustomobject]
图形进行后处理,以便再次删除注入的NUL字符。ForEach-Object
调用实现的,该调用包含一个帮助脚本块,该块递归地遍历对象图,其优点是**与JSON输入一起工作,其时间戳字符串可以是在层次结构的任何级别(即,它们也可以在嵌套对象的属性中)。'[ "2022-09-30T07:04:23.571+00:00" ]'
,则需要做更多的工作,其中字符串本身就是输入对象。nhaq1z213#
根据@zett42的输入,我的解决方案如下:
假设我们知道JSON中使用的日期的正则表达式模式,我将JSON作为字符串,添加一个前缀,以便
ConvertFrom-Json
不会将日期转换为日期时间,而是将其保留为字符串,使用ConvertFrom-Json
将其转换为PSCustomObject
,对对象执行我需要做的任何操作,将其序列化为带有ConvertTo-Json
的JSON字符串,然后再次删除前缀。u91tlkcl4#
更改日期格式的另外两种方法:
Get-Node
使用类似于**mklement0**递归函数的
Get-Node
:DIY
或者自己动手构建自己的Json反序列化程序:
用法: