如何检测PowerShell中JSON对象属性的数据类型?现有代码为何失效?
PowerShell获取JSON属性值类型并生成带引号的CSV字符串
为什么原代码无法获取属性值的实际类型
你之前的代码里,Get-Member -MemberType Properties返回的是属性的元数据对象(类型为MemberDefinition),而不是属性的实际值。所以你调用$_.GetType()时,拿到的是这个元数据对象的类型,自然看不到string或int这类值的类型。
查看属性值的实际类型
要获取属性值的类型,需要通过属性名称去提取$json.attrs对应的属性值,再判断其类型:
$str = '{"attrs": { "c1": "abc", "c2": 123}}' $json = $str | ConvertFrom-Json $json.attrs | Get-Member -MemberType Properties | ForEach-Object { # 通过属性名获取实际值 $propValue = $json.attrs.$($_.Name) # 输出属性名和对应的类型名称 "属性`"$($_.Name)`"的类型是: $($propValue.GetType().Name)" }
运行后会输出:
属性"c1"的类型是: String 属性"c2"的类型是: Int32
生成带引号的CSV字符串
针对你需要的CSV生成需求,修改代码如下,判断属性值是否为string类型,为字符串值添加双引号:
$str = '{"attrs": { "c1": "abc", "c2": 123}}' $json = $str | ConvertFrom-Json # 遍历属性并处理每个值 $csvSegments = $json.attrs | Get-Member -MemberType Properties | ForEach-Object { $propValue = $json.attrs.$($_.Name) # 判断是否为字符串类型 if ($propValue -is [string]) { # 为字符串添加双引号 "`"$propValue`"" } else { # 非字符串类型直接转为字符串 $propValue.ToString() } } # 拼接成CSV格式的字符串 $finalCsv = $csvSegments -join ',' Write-Output $finalCsv
运行后会输出:
"abc",123
关键说明
- 使用
-is [string]判断类型比GetType().Name -eq "String"更灵活,能兼容所有派生自string的类型 - 非字符串类型调用
ToString()确保输出为字符串格式,避免直接输出对象导致的格式异常 - 必须通过
$json.attrs.$($_.Name)获取属性的实际值,$_本身是属性的元数据对象,不是值
内容的提问来源于stack exchange,提问作者ca9163d9
相关产品推荐
相关产品推荐

