json - 如何遍历未知的 JSON 数据/对象?
问题描述
给定两个 JSON 示例
{
"A": {
"name": "noname",
"key": "nokey"
}
接着
{
"B": {
"property1": "value3",
"country": "australia"
}
}
是否可以创建一个 Powershell 脚本,该脚本可以采用其中一个 JSON 示例并在不知道任何名称/键的情况下循环遍历它们?(使用 Windows 2016)
类似于此处作为答案发布的内容如何循环或枚举 JavaScript 对象?
var p = {
"p1": "value1",
"p2": "value2",
"p3": "value3"
};
for (var key in p) {
if (p.hasOwnProperty(key)) {
console.log(key + " -> " + p[key]);
}
}
不工作
试过这个,但它只适用于第一级
$json = @"
{"A": {"property1": "value1", "property2": "value2"}, "B": {"property1":
"value3", "property2": "value4"}}
"@
$parsed = $json | ConvertFrom-Json
$parsed.PSObject.Properties | ForEach-Object {
$next = $_
$name = $_.Name
$value = $_.value
echo "$name = $value"
$next.PSObject.Properties | ForEach-Object {
$name = $_.Name
$value = $_.value
echo "Second level: $name = $value"
}
}
解决方案
ConvertFrom-Json
使用嵌套结构PSCustomObjects
来表示数据 - 您可以使用$x.psobject.properties
来获取结构中每个项目的 json 属性名称和值的集合,然后您可以根据需要循环它们。
例如:
$x = ConvertFrom-Json "{ 'A': {'name': 'noname', 'key': 'nokey'} }"
foreach( $rootProperty in @($x.psobject.properties | where-object {$_.MemberType -eq "NoteProperty"}) )
{
write-host "'$($rootProperty.Name)' = '$($rootProperty.Value)'"
foreach( $childProperty in @($rootProperty.Value.psobject.properties | where-object {$_.MemberType -eq "NoteProperty"}) )
{
write-host "'$($childProperty.Name)' = '$($childProperty.Value)'"
}
}
输出以下内容:
'A' = '@{name=noname; key=nokey}'
'name' = 'noname'
'key' = 'nokey'
如果您将上面的内容转换为在嵌套的 PSCustomObjects 上调用自身的函数,您也可以递归地将结构遍历到任意深度,但我不确定您是否需要能够做到这一点,或者只是像您的示例中那样进入 2 个级别json 文件。
推荐阅读
- sql-server - MSSql 获取日期的星期
- sql-server - 我想知道:没有用户界面的 SQL Server(2019 或所有服务器版本)的目的是什么?
- java - 如何在 1 个给定的 UAT 服务器中以计划模式运行 spring 批处理作业,但在所有 3 个给定的 UAT 服务器中运行手动作业?
- django - 如何在表单模型中调整 django ckeditor 的大小
- flutter - (Flutter / Riverpod)在任何情况下都不应该在 Riverpod 的提供者体内使用 ProviderReference.read 吗?
- python - python - 调用套接字命令的问题:winerror 10022
- ios - 将数据从 tableview 快速传递到 viewContoller
- xamarin - 如何在 Xamarin Forms IOS 中实现 AdMob 原生广告?
- android - 在 Android 上检测 *working* Vulkan 实现?
- go - 被构建标签禁用的包仍然链接到二进制文件中