regex - 用 -replace 和 REGEX 替换串联 JSON 格式字符串中的括号时出现问题
问题描述
我有一个从 API 获取 JSON 列表的脚本。对 API 的调用将仅返回 100 条记录,因此我使用 while 循环进行多次调用,然后将每个响应附加到字符串变量$rawData中。一旦循环完成,我在两个附加操作的每个连接处都会得到不正确的括号,它最终看起来像这样:
}
}
]
[
{
正确格式化,它应该如下所示:
}
},
{
我尝试了以下方法:
$rawData -replace "\s\s\}\]\[",','
$rawData -replace "\s\s\}\n\]\[",','
$rawData -replace "\s\s\}`n\]\[",','
$rawData -replace "\}\]\[",','
$rawData -replace "\}`n\]\[",','
$rawData -replace "\}\n\]\[",','
所有这些都返回以下内容,这完全让我感到困惑:
}
}
][
{
被指定为替换的逗号在哪里?它是如何在 ] 之后删除换行符的?然后我尝试使用以下方法简化它:
$rawData -replace "\]\[",','
输出:
}
}
,
{
很近!我假设那里有一个换行符,但我不知道如何摆脱它。我搜索了很多网站,现在完全感到沮丧。如果可能的话,你能告诉我正确的语法以及为什么我的尝试失败了吗?
- - 编辑 - -
谢谢麦克莱顿!这解决了这个问题,它肯定更有效。我仍在尝试了解 ConvertTo(From)-Json cmdlet 发生了什么。我仍然对 -replace 为什么不起作用以及如何使其工作以供将来参考非常感兴趣。如果有人对此有答案,那将非常有帮助。
解决方案
总结一下(并填写一些空白),你基本上是在做这样的事情:
$response1 = @"
[
{ "object": { "name": "object 1"} },
{ "object": { "name": "object 2"} },
{ "object": { "name": "object 3"} }
]
"@
$response2 = @"
[
{ "object": { "name": "object 4"} },
{ "object": { "name": "object 5"} },
{ "object": { "name": "object 6"} }
]
"@
$result = $response1 + $response2;
这给出了如下结果:
[
{ "object": { "name": "object 1"} },
{ "object": { "name": "object 2"} },
{ "object": { "name": "object 3"} }
][
{ "object": { "name": "object 4"} },
{ "object": { "name": "object 5"} },
{ "object": { "name": "object 6"} }
]
那不是有效的json。
@Colyn1337 的建议不是尝试用正则表达式修补文本,而是解析 json,加入对象,然后将其转换回文本:
$result = @( $response1, $response2 ) | convertFrom-Json
$result
#object
#------
#@{name=object 1}
#@{name=object 2}
#@{name=object 3}
#@{name=object 4}
#@{name=object 5}
#@{name=object 6}
现在您可以直接处理对象,也可以将其转换回单个 有效的json 字符串:
$json = $result | ConvertTo-Json
$json
#[
# {
# "object": {
# "name": "object 1"
# }
# },
# ... etc...
# {
# "object": {
# "name": "object 6"
# }
# }
#]
推荐阅读
- html - 纵向模式下的响应式 iframe 视频
- qt - 将数据添加到 QML TreeView
- c++ - 不使用 * 和 / 运算符将两个浮点数相乘和相除
- dev-null - 这个问题对社区来说并不有趣
- python - 如何使用 Python 打印非常大的 N%M 值?
- java - Java 8 获取不带最后一段的完整 URL 路径(带或不带斜杠)
- c++ - 即使在宏替换后也无法解析变量
- c++ - 如何不删除基类对象的副本?
- javascript - 在 javascript 中简单地获取 GET 请求到烧瓶服务器
- excel - 是否可以创建一个 Excel 宏来打开 Outlook 并搜索文本附件并打开特定的命名文件?