繁体   English   中英

使用 Powershell 将文件内容转换为可以使用 JSON 传输的字符串

[英]Using Powershell to convert a file's contents into a string that can be transferred using JSON

如何将文本文件的内容转换为字符串,然后将该字符串插入到 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 在本地编辑和存储它们。 如果这没有意义并且有更好的发送方式,那么也请告诉我。

iRon 的回答很有帮助地建议不要使用字符串操作在 PowerShell 中创建 JSON,而是使用哈希表(或自定义对象)来构造数据,然后将其转换为 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-ContentNoteProperty属性形式的元数据装饰它输出的字符串,而ConvertTo-Json目前总是包含这些。

  • 可以在GitHub 问题 #7537 中找到允许在调用Get-Content时选择退出此装饰的建议。
  • 作为补充, GitHub 问题 #5797建议ConvertTo-Json应该忽略原始 .NET 类型(例如strings )的额外属性。

最简单的解决方法使用.psobject.baseobject访问底层 .NET 实例,这会绕过 PowerShell 用来提供额外属性的不可见包装对象:

PS> @{ something = (Get-Content -Raw $sourceFilePath).psobject.baseobject } |
      ConvertTo-Json
{
  "something": "this\nis\na\nsample\nfile\n"
}

除了@mklement0 描述的实际问题和添加到Get-Content结果的元数据之外,只是一般性建议

不要干涉(替换,插入等)在任何Json内容。
相反,在将对象转换为 ( ConvertTo-Json ) Json文件之前修改对象(如有必要,使用ConvertFrom-Json恢复对象)。
在这个例子中,我将使用一个带有here-stringhash-table

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

结果:

{
    "something":  "this\nis\na\nsample\nfile"
}

您可以先使用Out-String cmdlet 将Get-Content的输出强制转换为扁平字符串:

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

这产生:

{
    "something":  "this\r\nis\r\na\r\nsample\r\nfile\r\n"
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM