我有一个多行字符串(来自 json(,例如
"somekey": "somevalue",
"somekey": "somevalue"
"somekey": [somevalue]
"somekey": somenumber
"somekey": null,
我想将字符串拆分为一个数组,其中每个元素的值要么是某个值的值,要么是某个数字的值。 (我本质上是形成一个数组,其中包含 json 中出现的每个值的值(
这应生成以下元素值:
somevalue
somevalue
somevalue
somenumber
我已经玩过以下代码的变体和补充:
$jsonValues = $jsonValues.Split(": ").Split([Environment]::NewLine)
但想知道实现这一目标的最雄辩的方法。
这是一个函数,它通常通过 JSON 文档中提取所有叶属性值,通过ConvertFrom-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
多亏了Lee_Dailey - 他的过滤器在抓取从原始 json 到数组的所有值时为我产生了最多的结果。
($InStuff -split [System.Environment]::NewLine).ForEach({$_.Split(':')[-1]}).Trim(' ",][')