【问题标题】:Nested json extract from powershell从PowerShell中嵌套的json提取
【发布时间】:2019-10-10 18:33:27
【问题描述】:

结果我需要显示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
 } 
}

文件 - 产品.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

你能帮我吗?

【问题讨论】:

    标签: json powershell csv


    【解决方案1】:

    您提供的 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"
    

    【讨论】:

    • 只有我必须只为那些在 produkct.csv 中的人下载,所以我必须使用该机制来获取我需要下载数据的产品的信息。至于json(我必须安排查询)我可以改变一些东西。因为我只是获取有关图片的信息,所以我没有问题
    • 我尝试为特定产品执行此操作,但从 api 下载时某些内容不起作用。我已经更正了代码不起作用``` $request = 'api.url/21221' Invoke-WebRequest $request | ConvertFrom-Json | $request.data.extended_info.images | ForEach-Object { [PSCustomObject]@{ id_product = $request.data.id_product id_image = $_.id url = $_.url } } ```
    【解决方案2】:
    • 由于您的product.csv 已经具有相同的标题,因此无需提供一个然后跳过第一行。
    • 您的单个​​ URL $request_n 也不需要使用 foreach 进行迭代
    • 我建议将 webrequest 和 convertfrom-json 的结果存储到 var $Json 中,然后继续 Martin Brandls 好的答案。

    ## 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 2015-07-24
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多