首页 > 解决方案 > 用 -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 为什么不起作用以及如何使其工作以供将来参考非常感兴趣。如果有人对此有答案,那将非常有帮助。

标签: regexstringpowershellreplace

解决方案


总结一下(并填写一些空白),你基本上是在做这样的事情:

$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"
#    }
#  }
#]

推荐阅读