使用Powershell将文件的内容转换为可以使用JSON

时间:2018-12-01 13:17:29

标签: json powershell

如何将文本文件的内容转换为字符串,然后将此字符串插入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 :(得分:5)

iRon's answer有助于建议不要在PowerShell中使用 string 操作创建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-Content使用元数据NoteProperty修饰其输出的字符串,并且ConvertTo-Json当前是总是包括这些。

  • this GitHub issue中找到了一个建议,允许在调用Get-Content时退出这种修饰。
  • 作为补充,this GitHub issue建议ConvertTo-Json忽略原始.NET类型(例如 strings )的额外属性。

最简单的解决方法是使用.psobject.baseobject 访问基础.NET实例,该实例绕过PowerShell用于提供额外属性的不可见包装对象:< / p>

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

答案 1 :(得分:2)

除了@ mklement0所描述的实际问题和添加到Get-Content结果中的元数据之外,

只是一般建议:

不要在任何Json内容中戳戳()(替换,插入等)。
相反,请先修改对象 (如有必要,请使用ConvertFrom-Json来还原对象),然后再将其转换为{{1} }文件。
在此示例中,我将为此使用ConvertTo-Jsonhash-table

Json

结果:

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

答案 2 :(得分:0)

您可以使用import cv2 import numpy as np def getSlopeOfLine(line): xDis = line[0][2] - line[0][0] if (xDis == 0): return None return (line[0][3] - line[0][1]) / xDis if __name__ == '__main__': inputFileName = '/Users/James/Desktop/img.jpg' img = cv2.imread(inputFileName) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) lines = cv2.HoughLinesP(gray, 1, np.pi / 180, 100, 30, 2) parallelLines = [] for a in lines: for b in lines: if a is not b: slopeA = getSlopeOfLine(b) slopeB = getSlopeOfLine(b) if slopeA is not None and slopeB is not None: if 0 <= abs(slopeA - slopeB) <= 0.6: parallelLines.append({'lineA': a, 'lineB': b}) for pairs in parallelLines: lineA = pairs['lineA'] lineB = pairs['lineB'] leftx, boty, rightx, topy = lineA[0] cv2.line(img, (leftx, boty), (rightx, topy), (0, 0, 255), 2) cv2.imshow('linesImg', img) cv2.waitKey(0) cmdlet首先将Out-String的输出强制转换为扁平字符串:

Get-Content

这将产生:

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