【问题标题】:ConvertTo-JSON from string - access JSON fields by name in PowerShellConvertTo-JSON from string - 在 PowerShell 中按名称访问 JSON 字段
【发布时间】:2021-11-28 17:59:03
【问题描述】:

如何访问像 $body.uuid 这样的字段? 这是我尝试过的:

$body = @"
{   "uuid": "Test07",
    "subject": "Template07-Subject",
}
"@

$bodyJSON = ConvertTo-Json $body

Write-Host $bodyJSON
Write-Host "uuid=$($bodyJSON.uuid)" 
Write-Host "uuid=$($bodyJSON.$uuid)" 

结果:

"{   \"uuid\": \"Test07\",\r\n    \"subject\": \"Template07-Subject\",\r\n}"
uuid=
uuid=

【问题讨论】:

  • 字符串已经包含 json - 你想要$object = ConvertFrom-Json $body; $object.uuid
  • @MathiasR.Jessen 我尝试了 ConverFrom-JSON,它给出了:ConvertFrom-Json:无效的 JSON 原语:

标签: json powershell


【解决方案1】:
  • 您的 $body 变量包含一个 JSON 字符串。

    • 除非您的意图是在 另一个 JSON 字符串中嵌入该字符串,否则不要在其上调用ConvertTo-Json - 后者的目的是转换对象 到 JSON 字符串
  • 为了将 JSON 字符串解析为 对象(图形),请将其传递给 ConvertFrom-Json,后者返回 [pscustomobject] 实例。

    • 您可以对结果对象使用常规属性访问,例如 .uuid

注意:

  • 正如bluuf 指出的那样,您的原始JSON 在"subject" 属性之后包含一个无关的,,这使得它在技术上是错误的——这已在下面得到纠正。

  • 但请注意,PowerShell (Core) 7+ 中的 ConvertTo-Json 仍接受此类 JSON,而 Windows PowerShell 不接受。

# Create a string containing JSON
$body = @"
{   
    "uuid": "Test07",
    "subject": "Template07-Subject"
}
"@

# Parse the JSON string into a PowerShell object (graph).
$bodyAsObject = ConvertFrom-Json $body

# Now you can use property access.
$bodyAsObject.uuid  # -> 'Test07'

【讨论】:

  • 感谢您的精彩解释。逗号在那里是因为我删除了一堆其他字段以创建一个更小的测试用例,然后忘记了它。我没有发现这是 ConvertFrom-Json 出错的原因。所以底线是,PowerShell 没有 JSON 对象概念。相反,它使用 pscustomobject 来模拟?
  • @NealWalters,是的,很容易忘记尾随逗号,这就是为什么一些 JSON 解析器方便地忽略它的原因。对于 PowerShell,JSON 只是一个 string - 一种基于文本的 序列化格式,必须将其反序列化为特定语言的对象图(包括在带有 JSON.parse() 的 JavaScript 中)。在 PowerShell 中,您使用 ConvertFrom-Json,它返回一个 [array of] [nested] [pscustomobject] instance(s)。
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 2015-06-01
  • 2018-08-08
  • 2015-03-20
  • 2015-05-25
  • 2021-11-30
  • 2017-05-13
  • 2015-02-17
相关资源
最近更新 更多