【问题标题】:Replace parameters in JSON with given Values from .csv将 JSON 中的参数替换为 .csv 中的给定值
【发布时间】:2021-07-31 18:22:01
【问题描述】:

我有一个 JSON 文件,我想在其中用占位符替换几个值。 所以我用要替换的参数制作了一个.csv。 line[0](如果存在)是文件中的路径,line[1] 是元素,line[2] 是占位符。

journeys.legs.origin.properties.downloads;url;placeholder;
;url;placeholder;
download;url;placeholder;
;psFileName;placeholder;
;serverTime;placeholder;
;calcTime;placeholder;

现在我定义了以下函数,以获取文件、读取 csv 并替换内容。

$storage = "D:\Service\test.json"
$parameters2replace = "D:\Service\parameters2replace.csv"


function Get-JSONProperty([object] $InputObject, [string] $Property) {
  $path = $Property -split '\.'
  $obj = $InputObject
  $path | %{ $obj = $obj.$_ }
  $obj
}

function setParameter(){
    foreach ($parameter in Get-Content $parameters2replace){
        $line=$parameter.split(";")        
        $path = $line[0]
        $elementName = $line[1]
        $newValue = $line[2]
        replaceElement $path $elementName $newValue       
    }        
}


function replaceElement($path, $elementName, $newValue){
    ForEach($JSONPath in Get-JSONProperty $JSON $path){
       if (!$line[0]){
            if($JSON.$elementName){
                $JSON.$elementName = $newValue
            }
        }
        else{
            if($JSON.$path.$elementName){
                echo $JSON.$path.$elementName
                $JSON.$path.$elementName = $newValue
            }
        }
    }
    $JSON | ConvertTo-Json -depth 32| set-content $storage 
}

    $JSON = Get-Content $storage -raw | ConvertFrom-Json
    setParameter

我现在的问题是,以下 if 参数不适用于 $path 变量。如果我把它硬编码,它工作得很好。

if($JSON.$path.$elementName)

我希望我能把一切都说清楚,这是我的第一篇文章。

【问题讨论】:

    标签: json powershell csv


    【解决方案1】:

    $JSON.$path 使 PowerShell 查找具有文字名称 'journeys.legs.origin.properties.downloads' 的属性。您需要将字符串拆分为各个部分并通过路径迭代(或递归):

    function Get-JSONPropertyValue {
      param(
        $JSON,
        [string]$Path,
        [string]$Name
      )
    
      $object = $JSON
      foreach($propName in $Path.Split('.')){
        $object = $object.$propName
      }
    
      return $object.$Name
    }
    
    function Set-JSONPropertyValue
    {
      param(
        $JSON,
        [string]$Path,
        [string]$Name,
        $Value
      )
    
      $object = $JSON
      foreach($propName in $Path.Split('.')){
        $object = $object.$propName
      }
    
      $object.$Name = $Value
    }
    

    现在你可以这样做了:

    if($value = Get-JSONPropertyValue $JSON -Path $path -Name $elementName){
        echo "Old value: $value"
        Set-JSONPropertyValue $JSON -Path $path -Name $elementName -Value $newValue
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-16
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 2015-01-31
      相关资源
      最近更新 更多