在贡献者@mklement0和@Theo的帮助下,我可以通过这个问题Powershell ConvertTo-Json problem with double-quotation marks中解释的解决方案获得良好的结果。 .
但是由于 JSON 格式的要求,我还有两个问题:
- mac 和 ip 地址的值应在方括号 ([ ]) 之间指示,并且每个值应在 ("") 之间指示,例如:
"mac_address": ["00:10:XX:10:00:0X", "X0:X0:11:X0:00:0X", "X0:11:X0:11:XX:11"]
- 在 file.txt 中,我还将获得以下键值信息:
product_executable : "C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE
我在上述问题中使用了当前代码,并且在开头得到了双反斜杠和一个新反斜杠:
"product_executable": "\"C:\\Program Files (x86)\\McAfee\\VirusScan Enterprise\\SHSTAT.EXE\" /!REMEDIATE"
我已经尝试处理哈希表输出($oht)但没有成功,并尝试修改添加和删除字符。
我的file.txt包含以下结构化信息(开头还有两个空行):
adapter_name : empty1
route_age : 10
route_nexthop : 172.0.0.1
route_protocol : NETMGMT1
speed : null
mac_address : 11:10:XX:10:00:0X, X1:X0:11:X0:00:0X, X1:11:X0:11:XX:11
product_executable : "C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE
adapter_name : empty2
route_age : 100
route_nexthop : 172.0.0.2
route_protocol : NETMGMT2
speed : null
mac_address : 22:10:XX:10:00:0X, X2:X0:11:X0:00:0X, X2:11:X0:11:XX:11
product_executable : "C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE
adapter_name : empty3
route_age : 1000
route_nexthop : 172.0.0.3
route_protocol : NETMGMT3
speed : null
mac_address : 33:10:XX:10:00:0X, X3:X0:11:X0:00:0X, X3:11:X0:11:XX:11
product_executable : "C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE
当前代码(参见提到的问题)是:
# 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
实际结果是:
[
{
"adapter_name" : "empty1",
"route_age" : 10,
"route_nexthop" : "172.0.0.1",
"route_protocol" : "NETMGMT1",
"speed" : null,
"mac_address" : "11:10:XX:10:00:0X, X1:X0:11:X0:00:0X, X1:11:X0:11:XX:11",
"product_executable" : "\"C:\\Program Files (x86)\\McAfee\\VirusScan Enterprise\\SHSTAT.EXE" /!REMEDIATE"
},
{
"adapter_name" : "empty2",
"route_age" : 100,
"route_nexthop" : "172.0.0.2",
"route_protocol" : "NETMGMT2",
"speed" : null,
"mac_address" : "22:10:XX:10:00:0X, X2:X0:11:X0:00:0X, X2:11:X0:11:XX:11",
"product_executable" : "\"C:\\Program Files (x86)\\McAfee\\VirusScan Enterprise\\SHSTAT.EXE" /!REMEDIATE"
},
{
"adapter_name" : "empty3",
"route_age" : 1000,
"route_nexthop" : "172.0.0.3",
"route_protocol" : "NETMGMT3",
"speed" : null,
"mac_address" : "33:10:XX:10:00:0X, X3:X0:11:X0:00:0X, X3:11:X0:11:XX:11",
"product_executable" : "\"C:\\Program Files (x86)\\McAfee\\VirusScan Enterprise\\SHSTAT.EXE" /!REMEDIATE"
}
]
预期结果是:
[
{
"adapter_name" : "empty1",
"route_age" : 10,
"route_nexthop" : "172.0.0.1",
"route_protocol" : "NETMGMT1",
"speed" : null,
"mac_address" : ["11:10:XX:10:00:0X", "X1:X0:11:X0:00:0X", "X1:11:X0:11:XX:11"],
"product_executable" : ""C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE"
},
{
"adapter_name" : "empty2",
"route_age" : 100,
"route_nexthop" : "172.0.0.2",
"route_protocol" : "NETMGMT2",
"speed" : null,
"mac_address" : ["22:10:XX:10:00:0X", "X2:X0:11:X0:00:0X", "X2:11:X0:11:XX:11"],
"product_executable" : ""C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE"
},
{
"adapter_name" : "empty3",
"route_age" : 1000,
"route_nexthop" : "172.0.0.3",
"route_protocol" : "NETMGMT3",
"speed" : null,
"mac_address" : ["33:10:XX:10:00:0X", "X3:X0:11:X0:00:0X", "X3:11:X0:11:XX:11"],
"product_executable" : ""C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE"
}
]
我非常感谢您的建议。
最佳答案
JSON 中的字符串可以采用转义序列。指定转义序列的字符是反斜杠\
。
转义序列的用途包括:
- 插入不可打印或空白字符(例如 TAB 或换行符或
null
) - 在字符串中插入双引号
"
(因为双引号既是字符串的开头又是结尾,因此您必须有办法说“我希望此引号成为的一部分 的字符串,而不是终止它)。 - 插入文字反斜杠
\
(由于 backlsash 是转义序列的开头,因此您需要一种方式来表示“我希望此反斜杠成为字符串的一部分” ,而不是开始转义序列)
因此,在您的示例中,您看到的是:
"\"C:\\Program Files (x86)\\McAfee\\VirusScan Enterprise\\SHSTAT.EXE\"/!REMEDIATE"
- 首先,用双引号
"
来启动 JSON 字符串。 - 然后紧接着
\"
,它表示“该字符串中的第一个字符是实际的”
” - 在本身由反斜杠
\
分隔的路径中,您需要将其设置为双斜杠,以便可以将其解释为单个反斜杠,而不是尝试将其解释为转义序列\P
程序文件
\M
cAfee
\V
irusScan
> 等等 - 在
SHSTAT.EXE
的末尾,您会看到下一个\"
,它放入了结束带引号的可执行字符串的文字引号中。
长话短说,一切都按预期进行。当您反序列化 JSON 时,一切都会按其应有的方式显示!
想确认一下吗?
$myString = @'
"C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE
'@
Write-Host $myString
$myJsonString = $myString | ConvertTo-Json
Write-Host $myJsonString
$undoJson = $myJsonString | ConvertFrom-Json
Write-Host $undoJson
关于Powershell ConvertTo-Json 缺少方括号并添加新字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58044886/