PowerShell에서 JSON 파일을 통한 루프

Salman Mehmood 2023년6월21일
  1. JSON을 통한 PowerShell 루프
  2. ConvertFrom-Json 사용
  3. 객체 역직렬화 사용
PowerShell에서 JSON 파일을 통한 루프

이 문서의 주요 목적은 PowerShell 스크립팅에서 JSON 파일을 반복하고 반복하는 방법을 보여주는 것입니다.

JSON을 통한 PowerShell 루프

PowerShell에서 스크립팅하는 동안 JSON 개체를 처리하는 동안 특정 속성에 액세스하기 위해 반복해야 할 수 있습니다.

다음 JSON 개체를 고려하십시오.

[
{
  "id": 1,
  "first_name": "Twila",
  "last_name": "Witcherley",
  "email": "twitcherley0@issuu.com",
  "gender": "Female",
  "ip_address": "129.230.255.192"
}, {
  "id": 2,
  "first_name": "Rafaelita",
  "last_name": "Fearnehough",
  "email": "rfearnehough1@nsw.gov.au",
  "gender": "Polygender",
  "ip_address": "247.204.187.100"
}, {
  "id": 3,
  "first_name": "Eimile",
  "last_name": "Denyer",
  "email": "edenyer2@nps.gov",
  "gender": "Female",
  "ip_address": "125.244.213.155"
}, {
  "id": 4,
  "first_name": "Sly",
  "last_name": "Conman",
  "email": "sconman3@meetup.com",
  "gender": "Polygender",
  "ip_address": "194.50.217.42"
}, {
  "id": 5,
  "first_name": "Augustine",
  "last_name": "Ciccotti",
  "email": "aciccotti4@google.ca",
  "gender": "Male",
  "ip_address": "192.158.101.100"
}
]

위에서 언급한 JSON의 맥락에서 id, first_name, last_name, email, genderip_address에 액세스해야 할 수 있습니다.

ConvertFrom-Json 사용

솔루션은 주로 PowerShell 버전을 기반으로 두 가지 방법으로 해결할 수 있습니다.

다음 스니펫을 고려하십시오.

$j =
@'
[{"id":1,"first_name":"Twila","last_name":"Witcherley","email":"twitcherley0@issuu.com","gender":"Female","ip_address":"129.230.255.192"},{"id":2,"first_name":"Rafaelita","last_name":"Fearnehough","email":"rfearnehough1@nsw.gov.au","gender":"Polygender","ip_address":"247.204.187.100"},{"id":3,"first_name":"Eimile","last_name":"Denyer","email":"edenyer2@nps.gov","gender":"Female","ip_address":"125.244.213.155"},{"id":4,"first_name":"Sly","last_name":"Conman","email":"sconman3@meetup.com","gender":"Polygender","ip_address":"194.50.217.42"},{"id":5,"first_name":"Augustine","last_name":"Ciccotti","email":"aciccotti4@google.ca","gender":"Male","ip_address":"192.158.101.100"}]
'@

foreach ($record in ($j | ConvertFrom-Json))
{
        write-host "$($record.id) | $($record.first_name) | $($record.last_name) | $($record.email) | $($record.gender) | $($record.ip_address)"
}

그러면 다음과 같은 결과가 나타납니다.

1 | Twila | Witcherley | twitcherley0@issuu.com | Female | 129.230.255.192
2 | Rafaelita | Fearnehough | rfearnehough1@nsw.gov.au | Polygender | 247.204.187.100
3 | Eimile | Denyer | edenyer2@nps.gov | Female | 125.244.213.155
4 | Sly | Conman | sconman3@meetup.com | Polygender | 194.50.217.42
5 | Augustine | Ciccotti | aciccotti4@google.ca | Male | 192.158.101.100

ConvertFrom-Json cmdlet을 사용하여 JSON 문자열을 PowerShell 데이터 구조로 변환할 수 있습니다.

ConvertFrom-JSON을 사용하는 이유는 PowerShell이 먼저 JSON 개체를 적절한 것으로 변환하지 않고 반복하는 것을 지원하지 않기 때문입니다. 이 경우 ConvertFrom-Json은 JSON 문자열을 PSCustomObject로 변환하는 데 사용되며 각 속성은 JSON 필드를 나타냅니다.

객체 역직렬화 사용

다음 스니펫을 고려하십시오.

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

$j =
@'
[{"id":1,"first_name":"Twila","last_name":"Witcherley","email":"twitcherley0@issuu.com","gender":"Female","ip_address":"129.230.255.192"},{"id":2,"first_name":"Rafaelita","last_name":"Fearnehough","email":"rfearnehough1@nsw.gov.au","gender":"Polygender","ip_address":"247.204.187.100"},{"id":3,"first_name":"Eimile","last_name":"Denyer","email":"edenyer2@nps.gov","gender":"Female","ip_address":"125.244.213.155"},{"id":4,"first_name":"Sly","last_name":"Conman","email":"sconman3@meetup.com","gender":"Polygender","ip_address":"194.50.217.42"},{"id":5,"first_name":"Augustine","last_name":"Ciccotti","email":"aciccotti4@google.ca","gender":"Male","ip_address":"192.158.101.100"}]
'@

$data = $JS.DeserializeObject($j)

$data.GetEnumerator() | foreach-Object {
    foreach ($key in $_.Keys)
	{
		Write-Host "$key : $($_[$key])"
	}
}

출력:

id : 1
first_name : Twila
last_name : Witcherley
email : twitcherley0@issuu.com
gender : Female
ip_address : 129.230.255.192
id : 2
first_name : Rafaelita
last_name : Fearnehough
email : rfearnehough1@nsw.gov.au
gender : Polygender
ip_address : 247.204.187.100
id : 3
first_name : Eimile
last_name : Denyer
email : edenyer2@nps.gov
gender : Female
ip_address : 125.244.213.155
id : 4
first_name : Sly
last_name : Conman
email : sconman3@meetup.com
gender : Polygender
ip_address : 194.50.217.42
id : 5
first_name : Augustine
last_name : Ciccotti
email : aciccotti4@google.ca
gender : Male
ip_address : 192.158.101.100

이 문제를 극복하기 위해 .NET JavaScriptSerializer를 사용하여 JSON 파일을 처리할 수 있습니다. JavaScriptSerializerDictionary를 반환하므로 GetEnumerator()foreach-Object 메서드를 사용하여 반복이 비교적 간단합니다.

System.Web.UI.WebResourceAttribute dll을 참조하려면 PowerShell 2.0 및 .NET Framework 2 - 4.8이 필요합니다.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

관련 문장 - PowerShell JSON