在powershell中解析json时遇到问题

在powershell中解析json时遇到问题,json,powershell,Json,Powershell,我有下面的JSON,它只是文件的一部分,但说明了它 我对JSON不是很有经验,我已经尝试了很多我能找到的例子,但它们似乎只显示了JSON,它只是键/值对。我已经看到了一些目标数组,但我无法将它们转换为特定的JSON 例如,我试图将“SavedPlayerDataVersion”等于8放入一个变量中,并将其放入一个对象中,但我不知道如何在数组和对象中定位该特定项 谁能给我指一下正确的方向吗 多谢各位 { "profileVersion": 1, "pr

我有下面的JSON,它只是文件的一部分,但说明了它

我对JSON不是很有经验,我已经尝试了很多我能找到的例子,但它们似乎只显示了JSON,它只是键/值对。我已经看到了一些目标数组,但我无法将它们转换为特定的JSON

例如,我试图将“SavedPlayerDataVersion”等于8放入一个变量中,并将其放入一个对象中,但我不知道如何在数组和对象中定位该特定项

谁能给我指一下正确的方向吗

多谢各位

{
    "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中导航,非常感谢您的帮助。现在我明白多了: