有没有办法从Powershell中的文件拆分json数据?

时间:2019-04-04 12:52:19

标签: json powershell replace split

我正在通过 powershell 从json文件中读取数据,最终目的是更新该文件。我需要将数据拆分为要保留的数据块和要更新的数据块,并使问题进一步复杂化,在整个foreach循环中,需要拆分文本的位置各不相同,因此我需要将该部分来自变量。

我已经在多种配置中尝试过.split/-split.replace/-replace,但似乎比在 powershell 中所假设的要难。

以下所有文件都位于同一文件夹中。

Json(json.json):

{
  "Section1": {
    "Heading1": [
      "Thing1",
      "Thing2"
    ]
  },
  "Section2": [
    "Thing1",
    "Thing2"
  ]
}

Powershell(powershell.ps1):

$originalJsonString = Get-Content -Path ".\json.json"
$SplitTarget = "Section2"

$JsonString = {This is the part that I am iffy about}

Write-Output $JsonString

我上面想要的输出是

{
"Section1": {
    "Heading1": [
        "Thing1",
        "Thing2"
    ]
},

我已经尝试过与拆分和替换有关的所有想法,但是解决方案却暗示了我。 请注意,在上述解决方案中,$originalJsonString被$ SplitTarget除而不是“ Section2”除以(或以其他方式)是一个重要因素,因为这也是我的等式中的一个因素。

这是我第一次问,所以如果我做错了事,我表示歉意。

谢谢。

编辑: 公平的是,我添加了我不转换为对象的原因。 当我将json转换为对象并返回时,powershell导出的语法是我所不希望的。 但是,如果仅使用对象,并且无法进行纵切,则必须找到其他解决方案。 谢谢。

编辑: 如果要使用对象,那么我最终找到了一种更复杂的方法来按照自己的方式格式化.json。 谢谢大家。

3 个答案:

答案 0 :(得分:2)

您应该做的是使用来读取json文件:

$json = Get-Content .\json.json -raw | ConvertFrom-Json

我在这里使用'here-string'伪造了它:

$json = @"
{
    "Section1": {
        "Heading1": [
            "Thing1",
            "Thing2"
        ]
    },
    "Section2": [
        "Thing1",
        "Thing2"
    ]
}
"@ | ConvertFrom-Json

下一步,定义您要保留或更新的内容:

$sectionToKeep   = "Section1"
$sectionToUpdate = "Section2"

要查看其中的内容,请使用$json.$sectionToKeep | ConvertTo-Json

{
    "Heading1":  [
                     "Thing1",
                     "Thing2"
                 ]
}

接下来,更新$ section2,其他所有内容均保持不变。我正在写一个存储数组的对象,就像在$sectionToKeep中一样:

$json.$sectionToUpdate = @{'Heading2' = 'Thing3', 'Thing4'}

最后输出(或写回文件)新的完整json:

$json | ConvertTo-Json

使用您的示例可以为您提供:

{
    "Section1":  {
                     "Heading1":  [
                                      "Thing1",
                                      "Thing2"
                                  ]
                 },
    "Section2":  {
                     "Heading2":  [
                                      "Thing3",
                                      "Thing4"
                                  ]
                 }
}

希望有帮助

答案 1 :(得分:1)

不确定是否真的了解您的问题,但是我会将Json转换为对象,然后过滤子数据并再次创建文件

$obj = Get-Content json.json -raw | ConvertFrom-Json

答案 2 :(得分:0)

如果您只想隔离一个部分并创建一个新的json文件,则可以使用以下内容:

$file = Get-Content .\json.json | ConvertFrom-Json
$file | Select-Object Section1 | ConvertTo-Json | Set-Content New.json