解析 JSON 数据第 2 部分
Parsing JSON Data Part 2
我问了一个之前的问题,并收到了 mklement0 的精彩回复,非常感谢。
JSON是:-
{
"results": [
{
"id": 1,
"first_name": "Jeanette",
"last_name": "Penddreth",
"email": "jpenddreth0@census.gov",
"gender": "Female",
"ip_address": "26.58.193.2",
"serverlist": [
{
"myval1": "testdata1",
"myval2": "testdata2",
"myval3": "testdata3"
}
],
"aitlist": [
{
"ait1": "aitdata1",
"ait2": "aitdata2"
}
]
},
{
"id": 2,
"first_name": "Giavani",
"last_name": "Frediani",
"email": "gfrediani1@senate.gov",
"gender": "Male",
"ip_address": "229.179.4.212",
"serverlist": [
{
"myval1": "testdata5",
"myval2": "testdata6",
"myval3": "testdata7"
},
{
"myval1": "testdata9",
"myval2": "testdata10",
"myval3": "testdata11"
}
],
"aitlist": [
{
"ait1": "aitdata3",
"ait2": "aitdata4"
}
]
},
{
"id": 3,
"first_name": "Noell",
"last_name": "Bea",
"email": "nbea2@imageshack.us",
"gender": "Female",
"ip_address": "180.66.162.255"
},
{
"id": 4,
"first_name": "Willard",
"last_name": "Valek",
"email": "wvalek3@vk.com",
"gender": "Male",
"ip_address": "67.76.188.26"
}
]
}
jigsw 的最后一块是我需要输出 JSON 文件中方括号中的所有项目,对于每个 'record' 一起输出,这与使用以下代码完全相同将输出数据:
(Get-Content -Raw C:\Temp\JsonFile.json | ConvertFrom-Json).Results | Out-GridView
最终输出将如下所示:
1,"Jeanette","Penddreth","jpenddreth0@census.gov","Female","26.58.193.2","{@{myval1=testdata1; myval2=testdata2; myval3=testdata3}}","{@{ait1=aitdata1; ait2=aitdata2}}"
输出在 Out-GridView
中的显示方式。
基于:
(Get-Content -Raw C:\Temp\JsonFile.json | ConvertFrom-Json).Results | ForEach-Object {
# Helper script block that walks an object graph and outputs all
# *scalar* leaf property values as-is, while using a single string to
# represent *array-valued* properties.
$sb = {
foreach ($el in @($args[0])) {
if ($el -is [System.Management.Automation.PSCustomObject]) { # a complex object -> recurse
foreach ($prop in $el.psobject.Properties) {
if ($prop.Value -is [array]) { # array-valued property
# Use the same representation that Out-GridView displays.
'"{0}"' -f ($prop.Value.ForEach({ $_.psobject.ToString() }) -join ',')
}
else { # scalar property -> recurse
& $sb $prop.Value
}
}
}
else {
# a leaf value -> output it, enclosed in embedded "..." if it is a string
if ($el -is [string]) { "`"$el`"" } else { $el }
}
}
}
# Call the script block with the input object at hand to collect all values,
# join them with ",", and output the result.
(& $sb $_) -join ','
}
根据您的样本输入,这会产生:
1,"Jeanette","Penddreth","jpenddreth0@census.gov","Female","26.58.193.2","@{myval1=testdata1; myval2=testdata2; myval3=testdata3}","@{ait1=aitdata1; ait2=aitdata2}"
2,"Giavani","Frediani","gfrediani1@senate.gov","Male","229.179.4.212","@{myval1=testdata5; myval2=testdata6; myval3=testdata7},@{myval1=testdata9; myval2=testdata10; myval3=testdata11}","@{ait1=aitdata3; ait2=aitdata4}"
3,"Noell","Bea","nbea2@imageshack.us","Female","180.66.162.255"
4,"Willard","Valek","wvalek3@vk.com","Male","67.76.188.26"
请注意,与 Out-GridView
' 表示相比,额外的 {...}
外壳被省略,因为它没有实际用途。
不过,从根本上说,表示是基于哈希表-like 表示,[pscustomobject]
实例通过它们的 .ToString()
方法进行字符串化,如中所述.
但是,由于 GitHub issue #6163 中描述的错误,必须在内部 .psobject
成员而不是 [pscustomobect]
实例本身上调用 .ToString()
方法。
我问了一个之前的问题,并收到了 mklement0 的精彩回复,非常感谢。
JSON是:-
{
"results": [
{
"id": 1,
"first_name": "Jeanette",
"last_name": "Penddreth",
"email": "jpenddreth0@census.gov",
"gender": "Female",
"ip_address": "26.58.193.2",
"serverlist": [
{
"myval1": "testdata1",
"myval2": "testdata2",
"myval3": "testdata3"
}
],
"aitlist": [
{
"ait1": "aitdata1",
"ait2": "aitdata2"
}
]
},
{
"id": 2,
"first_name": "Giavani",
"last_name": "Frediani",
"email": "gfrediani1@senate.gov",
"gender": "Male",
"ip_address": "229.179.4.212",
"serverlist": [
{
"myval1": "testdata5",
"myval2": "testdata6",
"myval3": "testdata7"
},
{
"myval1": "testdata9",
"myval2": "testdata10",
"myval3": "testdata11"
}
],
"aitlist": [
{
"ait1": "aitdata3",
"ait2": "aitdata4"
}
]
},
{
"id": 3,
"first_name": "Noell",
"last_name": "Bea",
"email": "nbea2@imageshack.us",
"gender": "Female",
"ip_address": "180.66.162.255"
},
{
"id": 4,
"first_name": "Willard",
"last_name": "Valek",
"email": "wvalek3@vk.com",
"gender": "Male",
"ip_address": "67.76.188.26"
}
]
}
jigsw 的最后一块是我需要输出 JSON 文件中方括号中的所有项目,对于每个 'record' 一起输出,这与使用以下代码完全相同将输出数据:
(Get-Content -Raw C:\Temp\JsonFile.json | ConvertFrom-Json).Results | Out-GridView
最终输出将如下所示:
1,"Jeanette","Penddreth","jpenddreth0@census.gov","Female","26.58.193.2","{@{myval1=testdata1; myval2=testdata2; myval3=testdata3}}","{@{ait1=aitdata1; ait2=aitdata2}}"
输出在 Out-GridView
中的显示方式。
基于
(Get-Content -Raw C:\Temp\JsonFile.json | ConvertFrom-Json).Results | ForEach-Object {
# Helper script block that walks an object graph and outputs all
# *scalar* leaf property values as-is, while using a single string to
# represent *array-valued* properties.
$sb = {
foreach ($el in @($args[0])) {
if ($el -is [System.Management.Automation.PSCustomObject]) { # a complex object -> recurse
foreach ($prop in $el.psobject.Properties) {
if ($prop.Value -is [array]) { # array-valued property
# Use the same representation that Out-GridView displays.
'"{0}"' -f ($prop.Value.ForEach({ $_.psobject.ToString() }) -join ',')
}
else { # scalar property -> recurse
& $sb $prop.Value
}
}
}
else {
# a leaf value -> output it, enclosed in embedded "..." if it is a string
if ($el -is [string]) { "`"$el`"" } else { $el }
}
}
}
# Call the script block with the input object at hand to collect all values,
# join them with ",", and output the result.
(& $sb $_) -join ','
}
根据您的样本输入,这会产生:
1,"Jeanette","Penddreth","jpenddreth0@census.gov","Female","26.58.193.2","@{myval1=testdata1; myval2=testdata2; myval3=testdata3}","@{ait1=aitdata1; ait2=aitdata2}"
2,"Giavani","Frediani","gfrediani1@senate.gov","Male","229.179.4.212","@{myval1=testdata5; myval2=testdata6; myval3=testdata7},@{myval1=testdata9; myval2=testdata10; myval3=testdata11}","@{ait1=aitdata3; ait2=aitdata4}"
3,"Noell","Bea","nbea2@imageshack.us","Female","180.66.162.255"
4,"Willard","Valek","wvalek3@vk.com","Male","67.76.188.26"
请注意,与 Out-GridView
' 表示相比,额外的 {...}
外壳被省略,因为它没有实际用途。
不过,从根本上说,表示是基于哈希表-like 表示,[pscustomobject]
实例通过它们的 .ToString()
方法进行字符串化,如中所述
但是,由于 GitHub issue #6163 中描述的错误,必须在内部 .psobject
成员而不是 [pscustomobect]
实例本身上调用 .ToString()
方法。