source

PowerShell : 필드 값으로 JSON 개체를 검색합니다.

nicesource 2023. 4. 4. 21:25
반응형

PowerShell : 필드 값으로 JSON 개체를 검색합니다.

다음 형식의 JSON에 대해 생각해 보겠습니다.

"Stuffs": [
    {
        "Name": "Darts",
        "Type": "Fun Stuff"
    },
    {
        "Name": "Clean Toilet",
        "Type": "Boring Stuff"
    }
]

PowerShell 3에서는 Stuffs 목록을 얻을 수 있습니다.

$JSON = Get-Content $jsonConfigFile | Out-String | ConvertFrom-Json

개체의 순서를 포함하여 목록의 정확한 내용을 알 수 없는 경우 Name 필드에 특정 값을 가진 개체를 검색하려면 어떻게 해야 합니까?

무차별적인 힘, 우리는 목록을 통해 반복할 수 있다:

foreach( $Stuff in $JSON.Stuffs ) { 

그러나 보다 직접적인 메커니즘이 존재하기를 바랍니다(C#의 Lync 또는 Lambda 표현과 유사).

$json = @"
{
"Stuffs": 
    [
        {
            "Name": "Darts",
            "Type": "Fun Stuff"
        },

        {
            "Name": "Clean Toilet",
            "Type": "Boring Stuff"
        }
    ]
}
"@

$x = $json | ConvertFrom-Json

$x.Stuffs[0] # access to Darts
$x.Stuffs[1] # access to Clean Toilet
$darts = $x.Stuffs | where { $_.Name -eq "Darts" } #Darts

여기서도 같은 질문을 했습니다.https://stackoverflow.com/a/23062370/3532136 좋은 솔루션이 있습니다.^^에게 도움이 되었으면 합니다.레줌에서는, 다음을 사용할 수 있습니다.

제 경우 Json 파일이 호출되었습니다.jsonfile.json:

{
    "CARD_MODEL_TITLE": "OWNER'S MANUAL",
    "CARD_MODEL_SUBTITLE": "Configure your download",
    "CARD_MODEL_SELECT": "Select Model",
    "CARD_LANG_TITLE": "Select Language",
    "CARD_LANG_DEVICE_LANG": "Your device",
    "CARD_YEAR_TITLE": "Select Model Year",
    "CARD_YEAR_LATEST": "(Latest)",
    "STEPS_MODEL": "Model",
    "STEPS_LANGUAGE": "Language",
    "STEPS_YEAR": "Model Year",
    "BUTTON_BACK": "Back",
    "BUTTON_NEXT": "Next",
    "BUTTON_CLOSE": "Close"
}

코드:

$json = (Get-Content "jsonfile.json" -Raw) | ConvertFrom-Json

$json.psobject.properties.name

출력:

CARD_MODEL_TITLE
CARD_MODEL_SUBTITLE
CARD_MODEL_SELECT
CARD_LANG_TITLE
CARD_LANG_DEVICE_LANG
CARD_YEAR_TITLE
CARD_YEAR_LATEST
STEPS_MODEL
STEPS_LANGUAGE
STEPS_YEAR
BUTTON_BACK
BUTTON_NEXT
BUTTON_CLOSE

mjolinor 덕분이에요.

David Brabant의 답변은 내가 필요한 것을 얻도록 이끌었고, 다음과 같은 추가사항을 추가했다.

x.Stuffs | where { $_.Name -eq "Darts" } | Select -ExpandProperty Type

이건 어때?

$json=Get-Content -Raw -Path 'my.json' | Out-String | ConvertFrom-Json
$foo="TheVariableYourUsingToSelectSomething"
$json.SomePathYouKnow.psobject.properties.Where({$_.name -eq $foo}).value

구조화된 json에서 선택할 수 있습니다.

{"SomePathYouKnow":{"TheVariableYourUsingToSelectSomething": "Tada!"}

이는 powershell SO 질문의 이 액세스 값에 기초하고 있습니다.파워셸 정말 멋지지 않아?

PowerShell 5.1에 대해서...

이름이 붙은 파일이 있다고 가정하고 조작하는 것jsonConfigFile.json투고에서 다음 내용을 기재합니다.

{
    "Stuffs": [
        {
            "Name": "Darts",
            "Type": "Fun Stuff"
        },
        {
            "Name": "Clean Toilet",
            "Type": "Boring Stuff"
        }
    ]
}

이렇게 하면 JSON 파일에서 순서가 지정된 해시 테이블이 생성되어 검색이 쉬워집니다.

$json = [ordered]@{}

(Get-Content "jsonConfigFile.json" -Raw | ConvertFrom-Json).PSObject.Properties |
    ForEach-Object { $json[$_.Name] = $_.Value }

$json.Stuffs멋진 해시테이블이 나열되겠지만 여기서부터는 좀 더 복잡해집니다.갖고 싶다고 말해 주세요.Type관련된 키의 값Clean Toilet키는 다음과 같이 가져옵니다.

$json.Stuffs.Where({$_.Name -eq "Clean Toilet"}).Type

귀찮은 일이지만, Windows 10 의 베어본 인스톨에 JSON 를 사용하는 것을 목표로 하고 있는 경우는, 이것이 최적인 방법입니다.

다음은 내 json 데이터입니다.

[
   {
      "name":"Test",
      "value":"TestValue"
   },
   {
      "name":"Test",
      "value":"TestValue"
   }
]

Powershell 스크립트:

$data = Get-Content "Path to json file" | Out-String | ConvertFrom-Json

foreach ($line in $data) {
     $line.name
}

언급URL : https://stackoverflow.com/questions/16575419/powershell-retrieve-json-object-by-field-value

반응형