Использование Powershell для преобразования содержимого файла в строку, которую можно передать с помощью JSON - PullRequest
0 голосов
/ 01 декабря 2018

Как преобразовать содержимое текстового файла в строку и затем вставить эту строку в файл JSON?

Например, если файл содержит:

this
is
a
sample
file

Сценарий будетсоздать:

"this\r\nis\r\na\r\nsample\r\nfile"

Чтобы вставить в шаблон JSON:

"something":"<insertPoint>"

Для создания:

"something":"this\r\nis\r\na\r\nsample\r\nfile"

Я использую Powershell 5 и мне удалось загрузитьфайл, сгенерируйте JSON и вставьте его, выполнив:

# get contents and convert to JSON
$contentToInsert = Get-Content $sourceFilePath -raw | ConvertTo-Json
# write in output file
(Get-Content $outputFile -Raw).replace('<insertPoint>', $contentToInsert) | Set-Content $outputFile

Однако, также добавлено много других нежелательных полей.

"something":"{
  "value":  "this\r\nis\r\na\r\nsample\r\nfile"
  "PSPath":  "C:\\src\\intro.md",
  "PSParentPath":  "C:\\src",
  "PSChildName":  "intro.md",
    etc...

В конечном счете, я пытаюсьотправляйте небольшие сегменты расширенного текста на веб-страницу через JSON, но хотите редактировать и сохранять их локально с помощью Markdown.Если это не имеет смысла и есть лучший способ отправить их, пожалуйста, дайте мне знать.

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Вы можете использовать командлет Out-String, чтобы сначала преобразовать вывод Get-Content в плоскую строку:

@{ "something" = (Get-Content lines.txt | Out-String) } | ConvertTo-Json

Это приводит к:

{
    "something":  "this\r\nis\r\na\r\nsample\r\nfile\r\n"
}
0 голосов
/ 01 декабря 2018

ответ iRon полезно не использовать string манипулирование для создания JSON в PowerShell, но использовать хеш-таблицы (или пользовательские объекты) для построения данных и затем преобразуйте его в JSON.

Однако одно это не решит вашу проблему:

PS> @{ something = Get-Content -Raw $sourceFilePath } | ConvertTo-Json
{
  "something": {
    "value": "this\nis\na\nsample\nfile\n",
    "PSPath": "/Users/mklement/Desktop/pg/lines.txt",
    # ... !! unwanted properties are still there
}

Основная причина проблемы заключается в том, что Get-Contentукрашает строки, которые он выводит, метаданными в форме NoteProperty свойств, а ConvertTo-Json в настоящее время неизменно включает их.

  • Предложение разрешить отказ отэто украшение при вызове Get-Content можно найти в этой проблеме GitHub .
  • В дополнение, эта проблема GitHub предполагает, что ConvertTo-Json должна игнорировать дополнительные свойства для примитиваТипы .NET, такие как строки .

Самый простой обходной путь заключается в доступе к базовому экземпляру .NET с помощью .psobject.baseobject,который обходит невидимую оболочку объекта PowerShellиспользует для предоставления дополнительных свойств:

PS> @{ something = (Get-Content -Raw $sourceFilePath).psobject.baseobject } |
      ConvertTo-Json
{
  "something": "this\nis\na\nsample\nfile\n"
}
0 голосов
/ 01 декабря 2018

Всего лишь общая рекомендация , кроме фактической проблемы, описанной @ mklement0, и метаданных, добавленных к результатам Get-Content:

Do not poke (заменить, вставить и т. Д.) В любом содержимом Json.
Вместо этого изменить объект (при необходимости используйте ConvertFrom-Json для восстановления объекта) до преобразования его в (ConvertTo-Json) файл Json.
В этом примере я бы использовал hash-table сhere-string для этого:

@{'something' = @'
this
is
a
sample
file
'@
} | ConvertTo-Json

Результат:

{
    "something":  "this\nis\na\nsample\nfile"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...