gpt4 book ai didi

带双引号的Powershell ConvertTo-Json问题

转载 作者:行者123 更新时间:2023-12-02 23:51:38 26 4
gpt4 key购买 nike

我正在尝试将文本文件转换为 JSON 格式的字符串,但双引号的位置不正确。

我的 file.txt 包含以下结构化信息(开头还有两个空行):

<p></p>

<p>adapter_name : empty1
route_age : 10
route_nexthop : 172.0.0.1
route_protocol : NETMGMT1
speed : null </p>

<p>adapter_name : empty2
route_age : 100
route_nexthop : 172.0.0.2
route_protocol : NETMGMT2
speed : null </p>

<p>adapter_name : empty3
route_age : 1000
route_nexthop : 172.0.0.3
route_protocol : NETMGMT3
speed : null
</p>

我的代码是:

$data = Get-Content C:\scripts\file.txt | %{$_.PSObject.BaseObject}
$data | ConvertTo-Json

没有这部分:

%{$_.PSObject.BaseObject}
它只是深入到对象树中,这可能需要很长时间。

实际结果是:


[
"",
"",
"adapter_name : empty1",
"route_age : 10",
"route_nexthop : 172.0.0.1",
"route_protocol : NETMGMT1",
"speed : null "
"",
"adapter_name : empty2",
"route_age : 100",
"route_nexthop : 172.0.0.2",
"route_protocol : NETMGMT2",
"speed : null "
"",
"adapter_name : empty3",
"route_age : 1000",
"route_nexthop : 172.0.0.3",
"route_protocol : NETMGMT3",
"speed : null "
]

预期的结果是:

[
{
"adapter_name" : "empty1",
"route_age" : 10,
"route_nexthop" : "172.0.0.1",
"route_protocol" : "NETMGMT1",
"speed" : null
},
{
"adapter_name" : "empty2",
"route_age" : 100,
"route_nexthop" : "172.0.0.2",
"route_protocol" : "NETMGMT2",
"speed" : null
},
{
"adapter_name" : "empty3",
"route_age" : 1000,
"route_nexthop" : "172.0.0.3",
"route_protocol" : "NETMGMT3",
"speed" : null
}
]

链接中的示例 4 和 5 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertto-json?view=powershell-6展示如何在类似情况下使用 cmdlet ConvertoTo-Json,但没有问题。

最佳答案

Get-Content 仅返回文本文件中的各个行,它对这些行中可能编码的任何结构一无所知。

因此,您只是将行按原样转换为 JSON,这会生成您所看到的 JSON 字符串值的平面列表。

要解决该问题,您必须自己将文本文件逐 block 解析为结构化对象(哈希表),然后将它们传递给 ConvertTo-Json:

# Read the input file as a whole (-Raw) and split it into blocks (paragraphs)
(Get-Content -Raw C:\scripts\file.txt) -split '\r?\n\r?\n' -ne '' |
ForEach-Object { # Process each block
# Initialize an ordered hashtable for the key-values pairs in this block.
$oht = [ordered] @{}
# Loop over the block's lines.
foreach ($line in $_ -split '\r?\n' -ne '') {
# Split the line into key and value...
$key, $val = $line -split ':', 2
# ... and add them to the hashtable.
$oht[$key.Trim()] = $val.Trim()
}
$oht # Output the hashtable.
} | ConvertTo-Json

以上产生了所需的输出。


顺便说一句,回复:

Without this part:
%{$_.PSObject.BaseObject}
It's just descending very deeply into the object tree which could take a long time.

问题是 Get-Content 用额外的、通常不可见的属性装饰它输出的行,这些属性提供原始信息,例如从中读取行的文件路径。

这些通常隐藏的属性在序列化场景中意外地出现,例如当使用 ConvertTo-Json 时。

上面的解决方案隐含地绕过了这个问题,因为新的字符串是在处理过程中创建的。

虽然额外的属性可能很有用,但它们通常不仅不需要,而且还会降低 Get-Content 的速度。

  • This GitHub issue建议向 Get-Content 添加一个开关,允许选择退出修饰行(从 PowerShell Core 7.0.0-preview.3 开始未实现)

  • 作为补充,this GitHub issue建议忽略与原始 JSON 类型相对应的类型的 PowerShell 添加的属性,其中包括 [string](自 PowerShell Core 7.0.0-preview.3 起未实现)

    <

关于带双引号的Powershell ConvertTo-Json问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58001914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com