仅导入从json到powershell的选择数据

时间:2014-09-23 19:36:27

标签: json powershell uri invoke-command

我想从Json url导入选定的数据,因此我可以将其转换为XML。

我正在使用以下代码导入。

(Invoke-RestMethod -URI "http://www.broadbandmap.gov/broadbandmap/broadband/dec2013/wireline?latitude=29.488412&longitude=-98.550208&format=json").Results.wirelineServices.providerName | Select-Object | Format-Table –AutoSize

所以我使用.Results.wirelineServices.providerName从一个分支/表中提取所选列。

如何同时从。Results.broadbandSource.stateFips提取数据?

谢谢你。

Json代码截图。
enter image description here


跟进问题
enter image description here

2 个答案:

答案 0 :(得分:4)

我认为你应该稍微分开一下你的步骤:

$r = Invoke-RestMethod -URI "http://www.broadbandmap.gov/broadbandmap/broadband/dec2013/wireline?latitude=29.488412&longitude=-98.550208&format=json"

$providers = $r.Results.wirelineServices.providerName
$stateFips = $r.Results.broadbandSource.stateFips

请注意,在您的示例中,您对Select-Object的调用是多余的(您没有选择任何内容,因此它不会更改输入对象)。

此外,关于Format-Table(以及任何Format- cmdlet)的非常重要的一点仅显示所以它们应该始终是你做的最后一件事,如果事实上他们根本就是需要的。

我给出的代码为您提供了对象中的信息,您可以根据需要使用这些信息,过滤或显示。我不确定您是如何使用/显示它的,但由于有多个提供程序且只有一个stateFips值,我可能会假设您将Fips值应用于每个提供程序。以下是使用我们创建的$stateFips变量的示例:

$r.Results.wirelineServices | Select-Object providerName,@{Name='stateFips' ; Expression={ $stateFips }}

这是一个仅使用原始结果$r的示例:

$r.Results.wirelineServices | Select-Object providerName,@{Name='stateFips' ; Expression={ $r.Results.broadbandSource.stateFips }}

Select-Object计算列语法

请注意,第二列定义看起来有点不稳定。它实际上是一个哈希表,允许您指定列的名称,以及一个表达式(一个完整的代码块),其返回值将是列的值。它可以分布在多行上:

$r.Results.wirelineServices | Select-Object providerName,@{
    Name = 'stateFips'
    Expression = { 
        $r.Results.broadbandSource.stateFips 
    }
}

或者您甚至可以先将哈希表创建为变量:

$computed = @{
    Name = 'stateFips'
    Expression = { 
        $r.Results.broadbandSource.stateFips 
    }
}
$r.Results.wirelineServices | Select-Object providerName,$computed

XML?

@Stephen Connolly的回答提醒我,你想用这个来制作XML。让我们采用上面的代码并将其分配给变量:

$computed = @{
    Name = 'stateFips'
    Expression = { 
        $r.Results.broadbandSource.stateFips 
    }
}
$data = $r.Results.wirelineServices | Select-Object providerName,$computed

由于$data仍然是一个对象,并且没有通过Format-命令发送,我们仍然可以使用它!

$xml = $data | ConvertTo-Xml -NoTypeInformation

正如他的评论也提出的那样,我们不知道你希望如何格式化生成的XML。

所以这是另一种方法:

忘记JSON

$r = Invoke-RestMethod -URI "http://www.broadbandmap.gov/broadbandmap/broadband/dec2013/wireline?latitude=29.488412&longitude=-98.550208&format=xml"

现在$r已包含XML。您可以将其过滤掉并使用XPATH进行修改。除非你认为这种方式对你有好处,否则我现在不会进入这个目标。

希望这有帮助,如果我误解了你在这里尝试做什么,请告诉我。

答案 1 :(得分:1)

如果您想要复合对象,请尝试

$results = (Invoke-RestMethod -URI "http://www.broadbandmap.gov/broadbandmap/broadband/dec2013/wireline?latitude=29.488412&longitude=-98.550208&format=json")
$obj = $results.Results.wirelineServices
$obj | add-member -type noteproperty -Name StateFips -Value $($results.Results.broadbandSource.stateFips) -PassThru 
$obj | convertto-xml -as string