在powershell中解析json时遇到问题
我有下面的JSON,它只是文件的一部分,但说明了它 我对JSON不是很有经验,我已经尝试了很多我能找到的例子,但它们似乎只显示了JSON,它只是键/值对。我已经看到了一些目标数组,但我无法将它们转换为特定的JSON 例如,我试图将“SavedPlayerDataVersion”等于8放入一个变量中,并将其放入一个对象中,但我不知道如何在数组和对象中定位该特定项 谁能给我指一下正确的方向吗 多谢各位在powershell中解析json时遇到问题,json,powershell,Json,Powershell,我有下面的JSON,它只是文件的一部分,但说明了它 我对JSON不是很有经验,我已经尝试了很多我能找到的例子,但它们似乎只显示了JSON,它只是键/值对。我已经看到了一些目标数组,但我无法将它们转换为特定的JSON 例如,我试图将“SavedPlayerDataVersion”等于8放入一个变量中,并将其放入一个对象中,但我不知道如何在数组和对象中定位该特定项 谁能给我指一下正确的方向吗 多谢各位 { "profileVersion": 1, "pr
{
"profileVersion": 1,
"profile": {
"id": 0,
"class": "PrimalPlayerDataBP_C",
"names": ["PrimalPlayerDataBP_C_29", "ArkGameMode", "PersistentLevel", "Aberration_P", "/Game/Maps/Aberration/Aberration_P"],
"properties": [{
"name": "SavedPlayerDataVersion",
"type": "IntProperty",
"value": 8
}, {
"name": "HexagonCount",
"type": "IntProperty",
"value": 106860
}, {
"name": "MyPersistentBuffDatas",
"type": "ArrayProperty",
"arrayType": "ObjectProperty",
"value": [1, 2, 3, 4]
}],
"extra": null
}
}
我在最初的答案之后编辑了这个问题,因为我意识到我还需要访问更深层次的内容。所以这将是对PlayerDataID的攻击
我尝试了$value=$jsonobj.profile.properties.mydata | Where Object{$$\uu.name-eq PlayerDataID}.value,但我没有得到它简单示例:
$json = '{ "one": 1, "two": 2 }'
$data = $json | ConvertFrom-Json | Select one
$myVal = $data.one
$myVal
打印输出将为1
就你而言:
$json = '{
"profileVersion": 1,
"profile": {
"id": 0,
"class": "PrimalPlayerDataBP_C",
"names": ["PrimalPlayerDataBP_C_29", "ArkGameMode", "PersistentLevel", "Aberration_P", "/Game/Maps/Aberration/Aberration_P"],
"properties": [{
"name": "SavedPlayerDataVersion",
"type": "IntProperty",
"value": 8
}, {
"name": "HexagonCount",
"type": "IntProperty",
"value": 106860
}, {
"name": "MyPersistentBuffDatas",
"type": "ArrayProperty",
"arrayType": "ObjectProperty",
"value": [1, 2, 3, 4]
}],
"extra": null
}}'
$data = $json | ConvertFrom-Json | Select -expand profile | Select -expand properties | Select name, type, value
$myVal = $data[0].value
$myVal
简单的例子:
$json = '{ "one": 1, "two": 2 }'
$data = $json | ConvertFrom-Json | Select one
$myVal = $data.one
$myVal
打印输出将为1
就你而言:
$json = '{
"profileVersion": 1,
"profile": {
"id": 0,
"class": "PrimalPlayerDataBP_C",
"names": ["PrimalPlayerDataBP_C_29", "ArkGameMode", "PersistentLevel", "Aberration_P", "/Game/Maps/Aberration/Aberration_P"],
"properties": [{
"name": "SavedPlayerDataVersion",
"type": "IntProperty",
"value": 8
}, {
"name": "HexagonCount",
"type": "IntProperty",
"value": 106860
}, {
"name": "MyPersistentBuffDatas",
"type": "ArrayProperty",
"arrayType": "ObjectProperty",
"value": [1, 2, 3, 4]
}],
"extra": null
}}'
$data = $json | ConvertFrom-Json | Select -expand profile | Select -expand properties | Select name, type, value
$myVal = $data[0].value
$myVal
你可以通过一条直线得到你想要的值 在演示中,我使用了一个Here字符串来表示json数据,但您可能会使用$data=Get Content-Path'thefile.json'-Raw | ConvertFrom json从文件中读取该字符串 然后,要从名为SavedPlayerDataVersion的属性中获取值,只需执行以下操作:
$value = ($data.profile.properties | Where-Object { $_.name -eq "SavedPlayerDataVersion" }).value
变量$value现在将包含8个,您可以使用一行程序获得所需的值 在演示中,我使用了一个Here字符串来表示json数据,但您可能会使用$data=Get Content-Path'thefile.json'-Raw | ConvertFrom json从文件中读取该字符串 然后,要从名为SavedPlayerDataVersion的属性中获取值,只需执行以下操作:
$value = ($data.profile.properties | Where-Object { $_.name -eq "SavedPlayerDataVersion" }).value
变量$value现在将包含8个JSON正是键值对,因此像在PowerShell中处理对象一样处理它是一种方法。从convertfromjson开始,将结果放入一个变量中,比如$myJson $myJson.profile.class将使您获得PrimalPlayerDataBP_C。这就是访问嵌套属性的方式。至于数组,您可以使用foreach遍历它们,使用where或select获取特定值,这取决于您实际需要什么
# This one returns the version number
$version = ($myJson.profile.properties | Where {$_.name -eq "SavedPlayerDataVersion"}).value
# This one checks whether version is 8
$isVersion8 = $NULL -ne `
($myJson.profile.properties | Where {$_.name -eq "SavedPlayerDataVersion" -and $_.value -eq 8})
使用数组项的索引访问数组项时要小心,因为您永远无法确定具有特定索引的项就是您要查找的项
在我写这封信的时候,@Theo比我抢先一步,这句话让我为他赢得了荣誉
编辑:
为了清晰起见,包括一个逐步的示例。你可以用更少的线来做同样的事情
# Get an array of properties
$properties = $myJson.profile.properties
# Select the property with the required name from the array
$myData = $properties | Where {$_.name -eq "MyData"}
# MyData is multivalued, so need to use 'Where' again
$playerDataId = $myData.value | Where {$_.name -eq "PlayerDataID"}
# Value you are looking for
$playerDataId.value
JSON正是键-值对,因此像在PowerShell中处理对象一样处理它是一条可行之路。从convertfromjson开始,将结果放入一个变量中,比如$myJson $myJson.profile.class将使您获得PrimalPlayerDataBP_C。这就是访问嵌套属性的方式。至于数组,您可以使用foreach遍历它们,使用where或select获取特定值,这取决于您实际需要什么
# This one returns the version number
$version = ($myJson.profile.properties | Where {$_.name -eq "SavedPlayerDataVersion"}).value
# This one checks whether version is 8
$isVersion8 = $NULL -ne `
($myJson.profile.properties | Where {$_.name -eq "SavedPlayerDataVersion" -and $_.value -eq 8})
使用数组项的索引访问数组项时要小心,因为您永远无法确定具有特定索引的项就是您要查找的项
在我写这封信的时候,@Theo比我抢先一步,这句话让我为他赢得了荣誉
编辑:
为了清晰起见,包括一个逐步的示例。你可以用更少的线来做同样的事情
# Get an array of properties
$properties = $myJson.profile.properties
# Select the property with the required name from the array
$myData = $properties | Where {$_.name -eq "MyData"}
# MyData is multivalued, so need to use 'Where' again
$playerDataId = $myData.value | Where {$_.name -eq "PlayerDataID"}
# Value you are looking for
$playerDataId.value
您好,谢谢您的回答,我已经编辑了我的原始问题,因为我意识到还需要从mydata密钥内的数组中提取PlayerDataID。所以我会用它来获取keep的全部数据,然后通过它来循环获取我想要的。我添加了一个更详细的示例来展示如何在json@user3284259Fantacious中导航,非常感谢您的帮助。现在我明白多了:您好,谢谢您的回答,我已经编辑了我的原始问题,因为我意识到还需要从mydata密钥内的数组中提取PlayerDataID。所以我会用它来获取keep的全部数据,然后通过它来循环获取我想要的。我添加了一个更详细的示例来展示如何在json@user3284259Fantacious中导航,非常感谢您的帮助。现在我明白多了: