我有一个多行字符串(来自json),例如
"somekey": "somevalue",
"somekey": "somevalue"
"somekey": [somevalue]
"somekey": somenumber
"somekey": null,
我想将字符串拆分为一个数组,其中每个元素的值可以是somevalue或somenumber的值。 (我实际上是在形成一个数组,其中包含json中出现的每个值的值)
这将产生以下元素值:
somevalue
somevalue
somevalue
somenumber
我玩过以下代码的变体和补充:
$jsonValues = $jsonValues.Split(": ").Split([Environment]::NewLine)
但想知道实现这一目标的最雄辩的方法。
答案 0 :(得分:3)
这是一个函数,该函数通常通过ConvertFrom-Json
使用正确的JSON解析,从JSON文档中提取所有叶子属性值:
# Accepts a JSON string and outputs all leaf property values.
function Get-JsonValue {
param([Parameter(ValueFromPipeline)] $json)
begin {
# Helper function that walks the object graph.
function walk {
param($obj)
# Note: @(...) is used so that scalar $null values aren't ignored.
foreach ($elem in @($obj)) {
if ($elem -isnot [System.Management.Automation.PSCustomObject]) {
$elem # leaf value -> output
}
else {
# recurse
foreach ($prop in $elem.psobject.Properties) {
foreach ($subElem in @($prop.Value)) { walk $subElem }
}
}
}
}
}
process {
walk ($json | ConvertFrom-Json)
}
}
# Sample JSON input
$json = @'
[ { "hi": 11 }, {
"somekey1": "somevalue1",
"somekey2": "somevalue2",
"somekey3": 42,
"somekey4": [
"somevalue4.1",
"somevalue4.2",
4.42
],
"somekey5": null
} ]
'@
# Call with the sample string
$json | Get-JsonValue
上面的结果如下:
11
somevalue1
somevalue2
42
somevalue4.1
somevalue4.2
4.42
# $null - not visible
答案 1 :(得分:0)
感谢Lee_Dailey-他的过滤器在将所有值从原始json抓取到数组中时,对我产生了最多的结果。
($InStuff -split [System.Environment]::NewLine).ForEach({$_.Split(':')[-1]}).Trim(' ",][')