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-Json
PSCustom 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-8
JSON에 관한 정보입니다.
메모들
- 할 수 된 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
'programing' 카테고리의 다른 글
$product_id - Woocommerce가 있는 항목 제거 (0) | 2023.03.06 |
---|---|
AngularJS에서 경로 변경 시 스크롤 위치를 유지하시겠습니까? (0) | 2023.03.06 |
두 개의 각진 앱/모듈을 한 페이지에 정의하려면 어떻게 해야 합니까? (0) | 2023.03.06 |
유형 '{}'을(를) 유형 'ReactNode'에 할당할 수 없습니다. (0) | 2023.03.06 |
입력 파일 개체를 JSON에 직렬화하려면 어떻게 해야 합니까? (0) | 2023.03.06 |