从Powershell嵌套的json提取

时间:2019-05-24 07:33:42

标签: json powershell csv

因此,我需要显示id_products,其余数据中包含照片ID和url图片。 下面是我从中提取数据的代码

$files_ro = "products.csv"
$Ident = Import-Csv -Path $files_ro -Header id_product | select-object -skip 1
foreach ($idka in $ident)
{
 $idp = $idka.id_product
 $request_n = "http://api.url/"+ $idp +"" 
 foreach($d1 in $request_n)
         {
     Invoke-WebRequest $d1 |     
     ConvertFrom-Json | 
     Select-Object -Expand data |
     Select -expand extended_info |
     select -expand images |
     Select id,url
 } 
}

个文件 -product.csv

"id_product"
"21221"
"23526"
"23525"
"24074"
"21302"
"24372"
"21272"
"21783"
"27268"
"21776"

json

{
 data: {
  id: 21221,
   extended_info: {
     images: [
                {
                    id: 34380,
                    url: photos1.jpg
                },
                {
                    id: 34381,
                    url: photos2.jpg
                },
                {
                    id: 34382,
                    url: photos3.jpg
                }
         ],
         }
     }
 }

我希望它看起来像这样:

id_product,id(images), url
21221,34380,photos1.jpg
21221,34381,photos2.jpg
21221,34382,photos3.jpg

您可以以某种方式帮助我吗?

2 个答案:

答案 0 :(得分:2)

您提供的JSON无效。但是,我将使用PSCustomObject来创建所需的结果:

$json = @'
{
    "data": {
        "id": 21221,
        "extended_info": {
            "images": [{
                    "id": 34380,
                    "url": "photos1.jpg"
                }, {
                    "id": 34381,
                    "url": "photos2.jpg"
                }, {
                    "id": 34382,
                    "url": "photos3.jpg"
                }
            ]
        }
    }
}
'@ | ConvertFrom-Json

$json.data.extended_info.images | ForEach-Object {
    [PSCustomObject]@{
        id_product = $json.data.id
        "id(images)" = $_.id
        url = $_.url
    }
}

输出:

id_product id(images) url
---------- ---------- ---
     21221      34380 photos1.jpg
     21221      34381 photos2.jpg
     21221      34382 photos3.jpg

要将结果转换为CSV,只需在最后一个花括号后添加| ConvertTo-Csv -NoTypeInformation,即可得到以下输出:

"id_product","id(images)","url"
"21221","34380","photos1.jpg"
"21221","34381","photos2.jpg"
"21221","34382","photos3.jpg"

答案 1 :(得分:0)

  • 由于您的product.csv已经具有相同的标题,因此不必提供一个标题,然后跳过第一行。
  • 您的单个​​URL $request_n也不需要使用foreach进行迭代
  • 我建议将来自webrequest的结果存储起来,并将from-json转换为var $ Json,并继续进行Martin Brandl的正确回答。

## Q:\Test\2019\05\24\SO_56287843.ps1
$files_ro = "products.csv"
$Ident = Import-Csv -Path $files_ro

$Data = foreach ($idka in $ident){
    $request_n = "http://api.url/{0}" -f $idka.id_product 
    $Json = Invoke-WebRequest $request_n | ConvertFrom-Json 

    # inserted code from Martin Brandl's good answer
    $Json.data.extended_info.images | ForEach-Object {
        [PSCustomObject]@{
            id_product   = $json.data.id
            "id(images)" = $_.id
            url          = $_.url
        }
    }
}

$Data 
$Data | Export-Csv ProductImages.csv -NoTypeInformation 
#$Data | Out-Gridview