2016-03-15 143 views
6

ConvertFrom-Jsonでpowershellスクリプトを書くとき、配列の値は文字列にキャストするときに追加のスペースで変換されるようです。次のコードは、小さなコードサンプルでこれを示していますPowershell ConvertFrom-Jsonで配列を追加すると、配列の値に余分なスペースが追加されます

$object = @" 
    { 
      "object": 
      {    
      "prop1": "value", 
      "array":[ 
       { "key": "value"}, 
       { "key2": "valuevalue"}, 
       { "key3": "valuevalue"}, 
       { "key4": "valuevalue"}, 
       { "key5": "valuevalue"} 
      ] 
      } 
    } 
"@ | ConvertFrom-Json 

$object.object.prop1 
$object.object.array.key 

$t = $object.object.prop1 
$t2= $object.object.array.key 
"""$t""" 
"""$t2""" 

出力:余分なスペースが最後の値にから来ている

value 
value 
"value" 
"value " 

?配列に値のペアを追加すると、スペースが追加されます。

+1

$ OFSを ''(ヌル文字列)に設定すると、出力に影響しますか? – mjolinor

+0

はい、それは動作しますが、なぜスペースが追加されますか? – Peter

+0

確かに言うことはできませんが、症状によって判断して、配列全体がカバーの下の[string]にキャストされているように見えます。 $ OFSは、配列が[文字列]にキャストされたときに配列要素を区切るために使用される区切り文字を指定する自動変数です。デフォルトは1つのスペースです。 nullに設定すると、空白がなくなりました。 – mjolinor

答えて

7

ConvertFrom-Jsonではなく、約$array.valueです。 v3またはv4からPowerShellを使用すると、ドット表記を使用して配列項目の指定されたプロパティを取得できます。 プロパティが存在しない場合、厳密モードがオンでない限り、結果はヌルです。 後者の場合は失敗します。ここで

は一例です:

$array = @(
    [PSCustomObject]@{key = 'value'} 
    [PSCustomObject]@{key2 = 'valuevalue'} 
) 

$result = $array.key 
$result.GetType().Name 
"[$result]" 

出力(結果の型と余分なスペースに注意)

Object[] 
[value ] 

だから、結果は配列です。配列に文字列をキャストすると、項目は がデフォルトセパレータとしてスペースで結合されます($OFSによって変更可能)。

上記の例をPowerShell v2で実行した場合、v2ではドット表記を使用して配列アイテムのプロパティを取得することがサポートされていないため、[]を取得します。

例をSet-StrictMode -Version 2で実行すると、エラーで失敗します。 このオブジェクトでは、プロパティ 'key'が見つかりません。すべてのPowerShellバージョンで失敗します。 v2では、配列にはプロパティkeyが含まれていないためです。 2番目の配列項目にはこのプロパティがないため、それ以降のバージョンです。

+1

良いキャッチ。これは、異なる単一のプロパティのオブジェクトの配列の自動メンバの列挙をしています。 – mjolinor

0

それはあなたがこのようにJSONを書いた場合より多くの意味を作ることがあります。つまり

{ 
     "object": 
     {    
     "prop1": "value", 
     "array":[ 
      { "Property1": "value1"}, 
      { "Property1": "value2"}, 
      { "Property1": "value3"}, 
      { "Property1": "value4"}, 
      { "Property1": "value5"} 
     ] 
     } 
} 

彼らはという名前のプロパティがないため、あなたはその後のアレイメンバーに空の文字列を取得します「キーを。」

関連する問題