Используйте адрес в качестве значения ключа JSON в powershell - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть файл JSON, где в качестве значения ключа используется строка 'address'. Я использовал ConvertFrom- Json, чтобы получить JSON в powershell. Когда я пытаюсь использовать значение ключа 'address', я получаю следующий вывод:

System.Object&, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e Address(int )

Когда я использую точно такой же код для других объектов из файла JSON, он работает, поэтому вопрос I Я спрашиваю, как я могу решить проблему с объектом 'address'.

Код, который я использовал для преобразования в JSON. Это действительно большой файл, поэтому на этапе тестирования я читаю JSON в $ json по одной строке за раз.

$encoding = [System.Text.Encoding]::UTF8    
$i = 0
$ig = 0
$output = @()


$Importfile = "Path\file.jsonl"
$Exportfile = "Path\file.csv"
#If file exists, it will be removed

if (test-path $Exportfile) {
    Remove-Item -path $Exportfile
}


foreach ($line in [System.IO.File]::ReadLines($Importfile, $encoding)) {
    $json = $line | ConvertFrom-Json
    $index = 1    

    foreach ($item in $json.history.addresses) {

    $CSVLine = "" | Select-Object Addressstreet, Addresspostalcode, Addresscity, Addressstate, Addresscountry, Addresslat, Addresslng, AddressformattedValue, Datum

    $CSVLine.Addressstreet = $json.history.addresses.address.street | Select-Object -First $index | Select-Object -Last 1
    $CSVLine.Addresspostalcode = $json.history.addresses.address.postalcode | Select-Object -First $index | Select-Object -Last 1
    $CSVLine.Addresscity = $json.history.addresses.address.city | Select-Object -First $index | Select-Object -Last 1
    $CSVLine.Addressstate = $json.history.addresses.address.state | Select-Object -First $index | Select-Object -Last 1
    $CSVLine.Addresscountry = $json.history.addresses.address.country | Select-Object -First $index | Select-Object -Last 1
    $CSVLine.Addresslat = $json.history.addresses.address.lat | Select-Object -First $index | Select-Object -Last 1
    $CSVLine.Addresslng = $json.history.addresses.address.lng | Select-Object -First $index | Select-Object -Last 1
    $CSVLine.AddressformattedValue = $json.history.addresses.address.formattedValue | Select-Object -First $index | Select-Object -Last 1
    $CSVLine.Datum =$json.history.addresses.date | Select-Object -First $index | Select-Object -Last 1


    $output += $CSVLine
    $index++
    }

    $i++
    $ig++
    if ($i -ge 20) {
        $output | Export-Csv -Path $Exportfile -NoTypeInformation -Delimiter ";" -Encoding UTF8 -Append
        $i = 0
        $output = @()
        Write-Output $ig 
    }
    if ($ig -ge 120){
        break
    }
}
$output | Export-Csv -Path $Exportfile -NoTypeInformation -Delimiter ";" -Encoding UTF8 -Append
Write-Output $ig

Структура JSON:

{"history": {
    "names": [{
        "name": {
            "name": "",
            "legalForm": "GmbH"
        },
        "date": "2007-09-18"
    }],
    "addresses": [{
        "address": {
            "street": "",
            "postalCode": ""
        },
        "date": "2019-08-05"
    }]}}

Кто-нибудь знает, как я могу решить эту проблему без изменения значения ключа 'address' в файле JSON?

1 Ответ

0 голосов
/ 29 апреля 2020

Используйте командлет select-object, если вы собираетесь ссылаться на элементы в массиве JSON

Предполагая, что ваш JSON правильно сформирован (в том числе нет), и у вас есть JSON запись в строке в файле:

Get-Content $Importfile -Encoding $encoding | % {
  $json = $_ | ConvertFrom-Json;
  $json | % { $_.history.addresses } | select -expand address
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...