从类型Json属性中提取属性

时间:2018-02-07 11:50:59

标签: json powershell

我在Azure管理cmdlet Get-UsageAggregates中返回的结构中有一些Azure使用情况数据。这在Json类型的属性中有一些信息,我想从中提取子属性。 这些数据包含在变量$usage中。如果我执行

$usage.UsageAggregations.properties | 
    select-object metercategory,metersubcategory,unit,quantity
                 ,@{Name="resource"; Expression={$_.InstanceData }}

我得到一个像这样的对象列表:

MeterCategory    : Storage
MeterSubCategory : Geo Redundant
Unit             : GB
Quantity         : 3.76344
resource         : {"Microsoft.Resources":{"resourceUri":"/subscriptions/[GUID]/resourceGroups/default-storage-
                   northeurope/providers/Microsoft.ClassicStorage/storageAccounts/MyAccountName","location":"eunorth"}}

我希望看到“MyAccountName”而不是Json字符串。我怎么能这样做?

我尝试使用

$usage.UsageAggregations.properties | 
    select-object metercategory,metersubcategory,unit,quantity
                 ,@{Name="resource"; 
                    Expression={$_.InstanceData | 
                                ConvertFrom-Json | 
                                select-object -Property Microsoft.Resources.resourceuri }}

但输出是

MeterCategory    : Storage
MeterSubCategory : Geo Redundant
Unit             : GB
Quantity         : 3.76344
resource         :  @{Microsoft.Resources.resourceuri=}

.value之后添加resourceuri也无济于事。

1 个答案:

答案 0 :(得分:1)

您的问题的要点是如何从以下JSON字符串中提取字符串MyAccountName(漂亮打印和简化):

$json = @'
{
  "Microsoft.Resources": {
    "resourceUri":  "/subscriptions/[GUID]/resourceGroups/.../MyAccountName",
    "location":  "eunorth"
  }
}
'@

ConvertFrom-Json-split运算符结合使用:

(($json | ConvertFrom-Json).'Microsoft.Resources'.resourceUri -split '/')[-1]
  • ConvertFrom-Json将JSON字符串转换为具有顶级属性Microsoft.Resources属性的自定义对象,该属性又是属性resourceUri和{{1 }}

  • location因此返回.'Microsoft.Resources'.resourceUri JSON属性的值 - 请注意引用 resourceUri的必要性,以确保其 embedded 'Microsoft.Resources'被视为属性名称的一部分,而不是属性名称之间的分隔符

  • .-split '/'将值拆分为令牌,并将其作为数组返回。

  • /引用该数组的 last 元素,在这种情况下为[-1]

至于您尝试的内容

MyAccountName不支持属性路径,只支持顶级属性名称
换句话说,您只能从输入对象中提取顶级属性;你无法深入研究它们。

因此,您可以提取顶级属性Select-Object - 其名称恰好包含Microsoft.Resources本身 - 但不是 .属性。

如果您尝试这样做,整个参数将被视为顶级属性名称,字面上名为resourceUri
如果输入对象没有此类属性,则输出对象的属性为创建,值为Microsoft.Resources.resourceUri [1]

通常,使$null提取属性 - 而不是返回自定义对象的默认行为该属性,您必须使用Select-Object 而不是-ExpandProperty

请注意,如果 使用 -Property ,则问题会变得更加明显,因为PowerShell然后会报告错误(如果无法找到给定名称的-level属性 [1]

-ExpandProperty

[1]但是,如果您尝试引用 <{1}}分隔字符串的组件> $json | ConvertFrom-Json | Select-Object -ExpandProperty Microsoft.Resources.resourceUri Select-Object : Property "Microsoft.Resources.resourceUri" cannot be found. ... 只需传递输入对象 -  见this GitHub issue