【问题标题】:Add key value pair to json file with powershell使用powershell将键值对添加到json文件
【发布时间】:2020-04-26 12:02:57
【问题描述】:

我有一个这样的 json,我想为文件中的每一行添加一个行键:值。

例如,在大括号前添加逗号和值 KC-NA-asplan-PROJECTS-DEV-01。

 [
     {
       "name": "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-01"
     },
     {
       "name": "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-02"
     }
    ]

$file="pathtojson"

$jsonContent = Get-Content $file | ConvertFrom-Json;


$appserviceplan= $jsonContent.name;

foreach ($app in $appserviceplan) {
$app.Split('/')[8]
}

我想在每一行中添加相应的 $app.Split('/')[8] 以便拥有

     "name": "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-01", "value": "KC-NA-asplan-PROJECTS-DEV-01"
 },

【问题讨论】:

    标签: json powershell parsing


    【解决方案1】:

    由于您的 Json 是一个对象数组,我认为显而易见的方法是遍历此对象列表,并为每个对象输出一个包含 value 属性的新对象。最简单的方法是使用Select-Object

    类似这样的:

    $file = "D:\blah.json"
    $json = Get-Content $file -Raw | ConvertFrom-Json | ForEach-Object {
        $_ | Select-Object name, @{Name = 'value'; Expression = {($_.name -split '/')[8]}}
    } | ConvertTo-Json
    
    $json
    

    结果:

    [
        {
            "name":  "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-01",
            "value":  "KC-NA-asplan-PROJECTS-DEV-01"
        },
        {
            "name":  "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-02",
            "value":  "KC-NA-asplan-PROJECTS-DEV-02"
        }
    ]
    

    【讨论】:

      【解决方案2】:

      使用ConvertTo-Json 应该适合你:

      (Get-Content $file | ConvertFrom-Json) | 
          Select-Object -Property *, @{name ="value"; expression={($_.name -split '/')[8]}} | 
          ConvertTo-Json |
          Out-File -FilePath .\newdata.json
      

      这会获取每个对象的所有现有属性(最初只是 name)并添加一个名为 value 的新属性,其值为 ($_.name -split '/')[8]

      然后,它使用 ConvertTo-Json 将生成的对象转换回 JSON,对于您的示例数据,最终结果为:

      [
          {
              "name":  "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-01",
              "value":  "KC-NA-asplan-PROJECTS-DEV-01"
          },
          {
              "name":  "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-02",
              "value":  "KC-NA-asplan-PROJECTS-DEV-02"
          }
      ]
      

      另请注意,可能需要将(Get-Content $file | ConvertFrom-Json) 括在括号中,如excellent SO answer 中所述。

      【讨论】:

      • 脚本运行,在文件中添加文件,但我得到这个错误并且每一行的值都是一样的。 Select-Object :无法处理该属性,因为属性“值”已存在。选择对象-Property *, @{name ="value";表达式={($_.name + CategoryInfo :InvalidOperation: (@{name=/subscri...PROJECT-DEV-02}:PSObject) [Select-Object], PSArgumentException+ FullyQualifiedErrorId : AlreadyExistingUserSpecifiedPropertyNoExpand,Microsoft.PowerShell.Commands.SelectObjectCommand .我想在json文件中为每一行添加相应的$_.name -split '/')[8]}。
      • 如果您的输入文件已经具有“值”作为属性,就会发生这种情况。是这样吗?
      • 不,没有。
      • 这还是你文件的原始内容吗? ` [ { "名称": "/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-01" }, { “名称”:“/subscriptions/uifaghy78923/resourceGroups/KC-NA-RSGP-PROJECTS-DEV-01/providers/Microsoft.Web/serverfarms/KC-NA-asplan-PROJECTS-DEV-02”}]`
      猜你喜欢
      • 2018-01-25
      • 2017-10-17
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多