programing

JSON 파일 PowerShell을 통한 반복

css3 2023. 3. 6. 21:20

JSON 파일 PowerShell을 통한 반복

PowerShell에서 아래의 JSON 파일을 루프하려고 합니다.

상위 태그(예: 17443 및 17444)를 구체적으로 명명하지 않으면 데이터를 루프하는 방법을 찾을 수 없습니다.

모든 레코드의 태그 3, 4, 5(제목, 이름, 성)를 출력하고 싶습니다.

내가 그걸 어떻게 해?

{
   "17443":{
      "sid":"17443",
      "nid":"7728",
      "submitted":"1436175407",
      "data":{
         "3":{
            "value":[
               "Mr"
            ]
         },
         "4":{
            "value":[
               "Jack"
            ]
         },
         "5":{
            "value":[
               "Cawles"
            ]
         }
      } },
      "17444":{
         "sid":"17444",
         "nid":"7728",
         "submitted":"1436891400",
         "data":{
            "3":{
               "value":[
                  "Miss"
               ]
            },
            "4":{
               "value":[
                  "Charlotte"
               ]
            },
            "5":{
               "value":[
                  "Tann"
               ]
            }
         }
      },
      "17445":{
         "sid":"17445",
         "nid":"7728",
         "submitted":"1437142325",
         "data":{
            "3":{
               "value":[
                  "Mr"
               ]
            },
            "4":{
               "value":[
                  "John"
               ]
            },
            "5":{
               "value":[
                  "Brokland"
               ]
            }
         }
      }
   }

아래의 코드로 데이터에 액세스 할 수 있습니다만, 17443, 17444등을 넣는 것은 피하고 싶습니다.

$data = ConvertFrom-Json $json

foreach ($i in $data.17443)
{
   foreach ($t in $i.data.3)
   {
      Write-Host $t.value
   }
   foreach ($t in $i.data.4)
   {
      Write-Host $t.value
   }
   foreach ($t in $i.data.5)
   {
      Write-Host $t.value
   }
}

PowerShell 3.0 이상

PowerShell 3.0 이상(설치된 PowerShell 버전 확인 참조)에서는ConvertFrom-Json구조로 합니다.cmdlet은 JSON의 데이터 구조를 PowerShell로 변환합니다.

느낄 수 있는 JSON을도 JSON을 소비하기 쉽기 입니다.JSON을 소비하는 것은 매우 쉽기 때문에 매우 편리합니다.행합니니다다ConvertFrom-JsonPSCustom Objects는 키와 값의 쌍으로 반복하기 어렵습니다.

. 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키, 키 등$result.thisKey.then.thatKey.array[1]그럼 끝이야

, 이 에서는, 「JSON」, 「JSON」, 「JSON」, 「JSON」, 「JSON」과 는 다이나믹의 것으로 ."17443" ★★★★★★★★★★★★★★★★★」"17444" 말은 즉, 우리는 수 PSCustomObject foreach이해할 수 있어요.

# helper to turn PSCustomObject into a list of key/value pairs
function Get-ObjectMember {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True, ValueFromPipeline=$True)]
        [PSCustomObject]$obj
    )
    $obj | Get-Member -MemberType NoteProperty | ForEach-Object {
        $key = $_.Name
        [PSCustomObject]@{Key = $key; Value = $obj."$key"}
    }
}

오브젝트 할 수 .Title,FirstName ★★★★★★★★★★★★★★★★★」LastName

$json = '{"17443": {"17444": {"sid": "17444","nid": "7728","submitted": "1436891400","data": {"3": {"value": ["Miss"]},"4": {"value": ["Charlotte"]},"5": {"value": ["Tann"]}}},"17445": {"sid": "17445","nid": "7728","submitted": "1437142325","data": {"3": {"value": ["Mr"]},"4": {"value": ["John"]},"5": {"value": ["Brokland"]}}},"sid": "17443","nid": "7728","submitted": "1436175407","data": {"3": {"value": ["Mr"]},"4": {"value": ["Jack"]},"5": {"value": ["Cawles"]}}}}'

$json | ConvertFrom-Json | Get-ObjectMember | foreach {
    $_.Value | Get-ObjectMember | where Key -match "^\d+$" | foreach {
        [PSCustomObject]@{
            Title = $_.value.data."3".value | select -First 1
            FirstName = $_.Value.data."4".value | select -First 1
            LastName = $_.Value.data."5".value | select -First 1
        }
    }
}

산출량

제목 성-----                      ---------                  --------샬럿 탄존 브로클랜드 씨

PowerShell 2.0 / 대체 접근법

PowerShell 2.0에서도 사용할 수 있는 대체 접근법(위의 일부 구성 요소를 지원하지 않음)을 사용하려면 를 사용해야 합니다.JSON을 처리하는 NET JavaScriptSerializer 클래스:

Add-Type -AssemblyName System.Web.Extensions
$JS = New-Object System.Web.Script.Serialization.JavaScriptSerializer

JavaScriptSerializer는 일반 사전을 제공하므로 위와 같은 작업을 수행할 수 있습니다. 이러한 작업은 키와 값의 쌍으로 쉽게 반복할 수 있습니다.GetEnumerator()★★★★

$json = '{"17443": {"17444": {"sid": "17444","nid": "7728","submitted": "1436891400","data": {"3": {"value": ["Miss"]},"4": {"value": ["Charlotte"]},"5": {"value": ["Tann"]}}},"17445": {"sid": "17445","nid": "7728","submitted": "1437142325","data": {"3": {"value": ["Mr"]},"4": {"value": ["John"]},"5": {"value": ["Brokland"]}}},"sid": "17443","nid": "7728","submitted": "1436175407","data": {"3": {"value": ["Mr"]},"4": {"value": ["Jack"]},"5": {"value": ["Cawles"]}}}}'

$data = $JS.DeserializeObject($json)

$data.GetEnumerator() | foreach {
    $_.Value.GetEnumerator() | where { $_.Key -match "^\d+$" } | foreach {
        New-Object PSObject -Property @{
            Title = $_.Value.data."3".value | select -First 1
            FirstName = $_.Value.data."4".value | select -First 1
            LastName = $_.Value.data."5".value | select -First 1
        }
    }
}

출력은 동일합니다.

제목 성-----                      ---------                  --------샬럿 탄존 브로클랜드 씨

JSON이 4MB보다 큰 경우 그에 따라 속성을 설정합니다.


파일에서 JSON 읽기

는 '읽다'를 사용하세요.Get-Content -Raw -Encoding UTF-8.

  • -Raw 그렇지 않으면 '''가 되기 때문에''Get-Content하고 행의 배열을 반환한다.JavaScriptSerializer.DeserializeObject에서는 Powershell의 타입된 것 같습니다.인수는 이 되지 않는 가 발생했을 경우는, NET 를 사용해 ( 단지합니다).-Raw.
  • -Encoding 파일을 때 입니다.UTF-8JSON에 관한 정보입니다.

메모들

  • 할 수 된 JSON을 는 JSON과 같은 합니다.{items: [{key: 'A', value: 0}, {key: 'B', value: 1}]}에 걸쳐서{'A': 0, 'B': 1}후자가 더 직관적인 것처럼 보이지만 생성하기도 어렵고 소비하기도 어렵습니다.
  • ConvertFrom-Json()(PowerShell 커스텀오브젝트를 합니다.(PSCustomObject는 JSON JSON 문문문열sonsonsonsonsonsonsonsonsonsonsonsonson.
  • 수 .Get-Member -type NoteProperty
  • , 「」를 합니다.$object."$propName"으로 "" 또는 " "" 또는 "displaces"$object."$(some PS expression)".
  • 를 직접 여러 할 수 .New-Object PSObject -Property @{...}, 「」를 참조해 주세요[PSCustomObject]@{ .. }

이 질문이 많이 나오네요.이 경우 속성을 두 번 반복해야 합니다.이것이 저의 현재 답변입니다.오브젝트를 작업하기 쉽게 만듭니다.최상위 레벨과 데이터 속성은 모두 "이름"과 "값"의 배열이 됩니다.Select-Object 계산 속성을 사용하여 원하는 방식으로 표시할 수 있습니다.JSON에서는 동일한 속성의 배열이 아닌 랜덤 속성을 얻는 경우가 더 많은 것 같습니다.

$a = cat file.json | convertfrom-json

$a = $a.psobject.properties | select name,value 
$a | foreach { $_.value.data = 
  $_.value.data.psobject.properties | select name,value }

$a.value.data.value

value
-----
{Mr}
{Jack}
{Cawles}
{Miss}
{Charlotte}
{Tann}
{Mr}
{John}
{Brokland}

jq와 비슷한 것을 시도하고 있습니다.

'{"prop1":1, "prop2":2, "prop3":3}' | jq to_entries | convertfrom-json

key    value
---    -----
prop1     1
prop2     2
prop3     3

또한 Powershell 7의 convertFrom-Json에는 키 및 값 속성을 제공하는 -AsHashTable 매개 변수가 있습니다.

$a = '{"name":"joe","address":"here"}' | ConvertFrom-Json -AsHashtable
$a

Name                           Value
----                           -----
name                           joe
address                        here

$a.keys
name
address

$a.values
joe
here

,를 ConvertFrom-Json구조로 합니다.cmdlet은 JSON의 데이터 구조를 PowerShell로 변환합니다.

그런 다음 중첩된 PowerShell 데이터 구조를 루프하는 방법을 설명하기 위해 간단한 예를 들어 설명합니다.

정해진

$response = [PSCustomObject] @{
    prediction = [PSCustomObject] @{
        cat = 0.6576587659
        dog = 0.3423412341
    }
}

우리의 목표는 예측 내부의 키-값 쌍(예: 고양이와 개)을 반복하고 그 값을 소수점 세 자리로 줄이는 것이다.

풀다

$response.prediction | Get-Member -MemberType NoteProperty | ForEach-Object {
    $key = $_.Name
    [PSCustomObject]@{Key = $key; Value = "{0:N3}" -f $response.prediction.$key}
}

예측의 모든 멤버를 먼저 루프한 후 각각의 멤버에 대해 새로운 멤버 키와 3진수 자리값을 할당합니다.

산출량

Key Value
--- -----
cat 0.658
dog 0.342

위의 설명에서 설명한 바와 같이, 이 과제는 로켓 제작에 의존하지 않고도 해결할 수 있습니다. =)

json 파일을 반복하기 위해 powershell 객체(json을 고려)인 변수를 참조할 수 있습니다.

어떤 $data인지 확인하세요.Ps Object.거기엔 흥미로운 것들이 많아=)

결정:

$data = ConvertFrom-Json $json

foreach ($elem in $data.PsObject.Properties.Value)
{
    Write-Host "Title:" $elem.data.3.value
    Write-Host "First Name:" $elem.data.4.value
    Write-Host "Surname:" $elem.data.5.value
}

다음은 간단한 regex 기반 솔루션입니다.라고 가정하면$sRawJson입력이 되어 있습니다.JSON 입력은 다음과 같습니다.

$oRegex = [Regex]'(?:(?<="[345]":\{"value"\:\["))[^"]+'
$cParts = $oRegex.Matches(($sRawJson -replace '\s')) | Select-Object -ExpandProperty "Value"

전체 이름을 얻기 위해 부품을 결합하는 중:

for ($i = 0; $i -lt $cParts.Count / 3; $i++) { $cParts[($i * 3)..($i * 3 + 2)] -join ' ' }

언급URL : https://stackoverflow.com/questions/33520699/iterating-through-a-json-file-powershell