2017-12-18 7 views
1

ここに私のData.jsonがあります。それはマルチレベルの配列を持っています。私はすべての配列要素を取得する必要があります。マルチレベルJSON配列を解析する方法は?

{ 
    "host": "http://localhost:5000", 
    "dlls": [ 
    { 
     "files": [ 
     { 
      "path": ".\\Xml.dll", 
      "store": ".\\DX\\OpenXml.dll" 
     }, 
     { 
      "path": ".\\Xml.dll", 
      "store": ".\\DX\\OpenXml.dll" 
     }, 
     { 
      "path": ".\\Xml.dll", 
      "store": ".\\DX\\OpenXml.dll" 
     }, 
     { 
      "path": ".\\Xml.dll", 
      "store": ".\\DX\\OpenXml.dll" 
     }, 
     { 
      "path": ".\\Xml.dll", 
      "store": ".\\DX\\OpenXml.dll" 
     } 
     ] 
    }, 
    { 
     "json": [ 
     { 
      "path": ".\\index.json", 
      "store": ".\\DX\\index.json" 
     }, 
     { 
      "path": ".\\index.json", 
      "store": ".\\DX\\index.json"   
     }, 
     { 
      "path": ".\\index.json", 
      "store": ".\\DX\\index.json"   
     }, 
     { 
      "path": ".\\index.json", 
      "store": ".\\DX\\index.json"   
     }, 
     { 
      "path": ".\\index.json", 
      "store": ".\\DX\\index.json"   
     }, 
     { 
      "path": ".\\index.json", 
      "store": ".\\DX\\index.json"   
     } 
     ] 
    } 
    ] 
} 

私の現在のPSスクリプトでは、私は一度繰り返すことができます:

$json = $null; 
$jsonparsed = $null; 
$validJson = $false; 
try { 
    $json = Get-Content -Raw $file; 
    $jsonparsed = ConvertFrom-Json $json -ErrorAction Stop; 
    $validJson = $true; 
} catch { 
    $validJson = $false; 
} 

if ($validJson) { 
    Write-Host "Provided text has been correctly parsed to JSON"; 
    Write-Host $jsonparsed; 
} else { 
    Write-Host "Provided text is not a valid JSON string" -ForegroundColor "Red"; 
    return; 
} 

を私はすべてのJSONの配列要素を解析する必要があります。各「パス」と「ストア」の値を取得します。 PowerShellバージョン5でどうすればいいですか?私はサードパーティのアセンブリを読み込んで解決策を見つけました。しかし、私は外部のアセンブリを使用することはできません。それは外部のアセンブリなしで解析可能ですか?

+0

は 'ConvertFrom-Json'は' PSCustomObject'を返しませんか?メンバーを解析するだけです。 – TheIncorrigible1

+0

代わりにどのような出力を期待していますか? – iRon

+0

これを探していますか? '$ jsonparsed | flatten'を参照してください:Flatten-Object:https://powersnippets.com/flatten-object/ – iRon

答えて

1

あなたはPowerShellの(V5)ウィンドウにこれを貼り付ける場合:

$jsonparsed = convertFrom-Json @' 
{ 
    "host": "http://localhost:5000", 
    "dlls": [ 
    { 
     "files": [ 
     { 
      "path": ".\\Xml.dll", 
      "store": ".\\DX\\OpenXml.dll" 
     }, 
     { 
      "path": ".\\Xml.dll", 
      "store": ".\\DX\\OpenXml.dll" 
     }, 
     { 
      "path": ".\\Xml.dll", 
      "store": ".\\DX\\OpenXml.dll" 
     }, 
     { 
      "path": ".\\Xml.dll", 
      "store": ".\\DX\\OpenXml.dll" 
     }, 
     { 
      "path": ".\\Xml.dll", 
      "store": ".\\DX\\OpenXml.dll" 
     } 
     ] 
    }, 
    { 
     "json": [ 
     { 
      "path": ".\\index.json", 
      "store": ".\\DX\\index.json" 
     }, 
     { 
      "path": ".\\index.json", 
      "store": ".\\DX\\index.json"   
     }, 
     { 
      "path": ".\\index.json", 
      "store": ".\\DX\\index.json"   
     }, 
     { 
      "path": ".\\index.json", 
      "store": ".\\DX\\index.json"   
     }, 
     { 
      "path": ".\\index.json", 
      "store": ".\\DX\\index.json"   
     }, 
     { 
      "path": ".\\index.json", 
      "store": ".\\DX\\index.json"   
     } 
     ] 
    } 
    ] 
} 
'@ 

Write-Host $jsonparsed.host 
ForEach ($dll in $jsonparsed.dlls) { 
    ForEach ($file in $dll.files) { 
     Write-Host $file.path 
     Write-Host $file.store 
    } 
    ForEach ($json in $dll.json) { 
     Write-Host $json.path 
     Write-Host $json.store 
    } 
} 

あなたはこの取得する必要があります。

.\Xml.dll 
.\DX\OpenXml.dll 
.\Xml.dll 
.\DX\OpenXml.dll 
.\Xml.dll 
.\DX\OpenXml.dll 
.\Xml.dll 
.\DX\OpenXml.dll 
.\Xml.dll 
.\DX\OpenXml.dll 
.\index.json 
.\DX\index.json 
.\index.json 
.\DX\index.json 
.\index.json 
.\DX\index.json 
.\index.json 
.\DX\index.json 
.\index.json 
.\DX\index.json 
.\index.json 
.\DX\index.json 
+0

申し訳ありませんが、私は動作しません。 ForEachのトップレベルループForEach($ dson in $ jsonparsed.dlls)の内部には入っていません。だから私は何も表示されません – masiboo

+0

@iRonから新しいPowerShellウィンドウにコードを貼り付けても問題なく動作します。 – rufer7