Вложенный json-фрагмент из powershell - PullRequest
2 голосов
/ 24 мая 2019

Мне нужно показать id_products в результате, остальные данные у меня есть идентификатор фотографии и 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 ]

2 голосов
/ 24 мая 2019

Ваш предоставленный 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"
0 голосов
/ 24 мая 2019
  • Поскольку у вашего product.csv уже есть тот же заголовок, указывать его не нужно, а затем пропустить первую строку.
  • Ваш единственный URL $request_n такжене нужно повторять с foreach
  • Я предлагаю сохранить результат веб-запроса и преобразовать его из 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...