Заменить символ в JSON другими значениями массива - PullRequest
1 голос
/ 14 июля 2020

У меня есть 2 файла текст. json которые содержат

{
    "Files": [
        {
            "pattern": "/Something/Something/*"
        },
        {
            "pattern": "/Something/Something/*"
        },
        {
            "pattern": "/Something/Something/*"
        },
        {
            "pattern": "/Something/Something/*"
        },
        {
            "pattern": "/Something/Something/*"
        },
        {
            "pattern": "/Something/Something/*"
        }
    ]
}

и dlls.txt

1.dll
2.dll
..
6.dll

Я хочу чтобы заменить символ * на необходимую dll, например:

"Files": [
        {
            "pattern": "/Something/Something/1.dll"
        },
        {
            "pattern": "/Something/Something/2.dll"
        },
       .
       .
       .
        {
            "pattern": "/Something/Something/6.dll"
        }
    ]
}

Пока мой код заменяет символ, но только на последний элемент массива.

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Поскольку вы имеете дело со структурированным форматом данных - JSON - использование выделенного парсера всегда предпочтительнее для выполнения чисто текстовой обработки на основе регулярные выражения .

При использовании выделенных командлетов ConvertFrom-Json и ConvertTo-Json для синтаксического анализа и сериализации обратно в JSON есть медленнее , чем текстовая обработка, намного больше надежнее .

# Read the DLL names from the text file into an array of strings.
$dlls = Get-Content dlls.txt

# Read the JSON file and parse it into an object.
$objFromJson = Get-Content -Raw text.json | ConvertFrom-Json

# Loop over all elements of the array in the .Files property and
# update their .pattern property based on the corresponding DLL names.
$i = 0
$objFromJson.Files.ForEach({ 
  $_.pattern = $_.pattern -replace '(?<=/)\*$', $dlls[$i++] 
})

# Convert the updated object back to JSON; save to a file as needed.
$objFromJson | ConvertTo-Json
1 голос
/ 14 июля 2020

Почему бы не пропустить файл 'C:\Users\itsan\Desktop\text.json' полностью и просто создать новый JSON из имен файлов dll, которые у вас есть в 'C:\Users\itsan\Desktop\dlls.txt'?

$dlls = Get-Content -Path 'C:\Users\itsan\Desktop\dlls.txt'

$result = [PsCustomObject]@{
    Files = foreach($file in $dlls) {
        "" | Select-Object @{Name = 'pattern'; Expression = {"/Something/Something/$file"}}
    }
}
$result | ConvertTo-Json

Если вы хотите, чтобы это был новый файл, просто измените последняя строка в

$result | ConvertTo-Json | Set-Content -Path 'C:\Users\itsan\Desktop\dll.json'

Результат будет таким:

{
    "Files":  [
                  {
                      "pattern":  "/Something/Something/1.dll"
                  },
                  {
                      "pattern":  "/Something/Something/2.dll"
                  },
                  {
                      "pattern":  "/Something/Something/3.dll"
                  },
                  {
                      "pattern":  "/Something/Something/4.dll"
                  },
                  {
                      "pattern":  "/Something/Something/5.dll"
                  },
                  {
                      "pattern":  "/Something/Something/6.dll"
                  }
              ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...