【问题标题】:Problem replacing brackets in concatenated JSON formatted string with -replace and REGEX用 -replace 和 REGEX 替换串联 JSON 格式字符串中的括号时出现问题
【发布时间】:2021-06-22 16:34:34
【问题描述】:

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

【问题讨论】:

  • 我建议您在收集 json 输出的时候解决这个问题,而不是像这样。
  • Ehm,为什么不转换from-json,将它们连接在一起,然后操作或输出为json?或者,是否没有异步读取选项?如果您提供完整的详细信息,对您的帮助会更大。

标签: regex string powershell replace


【解决方案1】:

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

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

【讨论】:

  • 非常感谢!这非常有效!我刚刚编辑了我的循环,所以它一开始就没有被转换。 while ($apiURL) { $response = Invoke-RestMethod $apiUrl -Method Get -Headers $headers $rawData = $rawData + $response.users #($response.users | ConvertTo-Json -Depth 6) if ($response.meta.has_more) { $apiUrl = $response.links.next } else { $apiUrl = $null } } 然后在循环之后,我将 $rawData 转换为 JSON 一次,并将 Out-File 转换为 .json 文件。只是为了将来,为什么 -replace 不起作用?
  • @WinArchitect - “为什么 -replace 不起作用” - 因为替换 json 字符串中的文本很复杂且容易出错 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
相关资源
最近更新 更多