ConvertTo-Jsonを使用してPowerShell配列をjsonに変換する方法は?

4
mark 2019-10-30 00:11.

観察する:

C:\> [array]@(1,2) | ConvertTo-Json
[
    1,
    2
]
C:\> [array]@(1) | ConvertTo-Json
1
C:\> [array]@() | ConvertTo-Json
C:\>

(最後の2つのケースからそれぞれ[1]と[]を期待します)

それで、標準的なConvertTo-Json方法を使用したい場合、配列に1つまたは0の要素が含まれている場合でも、どうすれば確実に使用できますか?

配列がjsonに変換された複雑なオブジェクトの一部である場合、結果の後処理は実行できないことに注意してください。

編集1

C:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.17763.592
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17763.592
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1


C:\> [array]@(1) | ConvertTo-Json -AsArray
ConvertTo-Json : A parameter cannot be found that matches parameter name 'AsArray'.
At line:1 char:30
+ [array]@(1) | ConvertTo-Json -AsArray
+                              ~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [ConvertTo-Json], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.ConvertToJsonCommand

C:\>

2 answers

4
mklement0 2019-10-30 08:19.

PowerShell Core(v6 +)は-AsArray、下のセクションで説明する便利なスイッチを提供します。


$valが空の配列、スカラー、または配列のいずれかである場合は、パイプライン介して送信, @($val)ConvertTo-Json 配列としてシリアル化されるようにします。

if (-not $IsCoreCLR) { # Workaround for Windows PowerShell # Only needed once per session. Remove-TypeData -ErrorAction Ignore System.Array } # Send an empty array, a single object, and an array... @(), 1, (1, 2) | ForEach-Object { # ... and ensure that each input ($_) serializes as a JSON *array*.
  , @($_) | ConvertTo-Json 
}

注意:

  • Windows PowerShellの回避策の必要性は、この回答で説明されています。

  • ,配列構築演算子は、ここでは1進形式で使用され、パイプラインを介して配列全体を(単一のオブジェクトとして)送信するために、補助的な単一​​要素のラッパー配列を提供しますデフォルトでは、配列(列挙可能)をパイプラインに送信すると、その要素が1つずつ送信されます。これは、関連するコマンドレットに関係なく、基本的なパイプラインの動作であることに注意してください。

  • @(...)「array-guarantor」演算子(array-subexpression演算子)は、が配列$_であること保証します。つまり、オペランドがすでに1つでない限り、配列でラップします(大まかに言えば[1])。これは$_単一のオブジェクト(スカラー1、この場合)のみを含む場合をカバーするために必要です。

  • 一般的な注意事項ConvertTo-Jsonシリアル化の深さを2デフォルト静かに制限します。これにより、より深くネストされた入力で静かなデータ損失が発生します-Depth必要に応じてパラメータを使用してください。

    • このSO投稿では、問題について説明しています。

    • この関連するGiHubの問題では、危険なデフォルトの動作を変更する必要があります。同意する場合は、そこで声を聞いてください。

上記の結果、次のようになります。各入力が配列としてどのようにシリアル化されたかに注意してください。

[]
[
  1
]
[
  1,
  2
]

また、あなたが入力として渡すことができ、引数をするConvertTo-Json@($val)

# Same output as above.
@(), 1, (1,2) | ForEach-Object { ConvertTo-Json @($_) }

位置引数は暗黙的に-InputObjectパラメーターにバインドされます。パラメーターはその引数を列挙しないため、配列をそのままバインドします。したがって@()、この場合は「配列保証人」のみが必要です(のラッパー配列も必要ありません)。


PowerShell Coreは、-AsArray入力オブジェクトが1つしかない場合でも、入力が配列としてシリアル化されることを直接保証するスイッチを提供するようになりました。

PS> 1 | ConvertTo-Json -AsArray
[
  1
]

ただし、空の配列ではパイプラインを介してデータが送信されないため、入力が空の配列である場合はラッパー配列が必要であり、次を使用しないでください-AsArray

# Note:
#   @() | ConvertTo-Json -AsArray
# would result in NO output.
# Use `, ` to wrap the empty array to ensure it gets sent through
# the pipeline and do NOT use -AsArray
PS> , @() | ConvertTo-Json -Compress

[]

または、空の配列を引数として再度渡します

PS> ConvertTo-Json @() -Compress # Do NOT use -AsArray

[]

問題は、入力-AsArray 無条件にJSON配列でラップするため、すでに配列であるものが再びラップされることです。

PS> ConvertTo-Json -AsArray @() -Compress

[[]]  # *nested* empty arrays

これ-AsArrayは、このGitHubの問題で説明されているように、配列の「保証人」として機能しませ@(...)


[1]オペランドがスカラー(単一オブジェクト)の場合、単一要素でラップされ[object[]]ます。オペランドがすでに配列であるか列挙可能である場合、要素は列挙され、新しい [object[]]配列にキャプチャされます。

3
js2010 2019-10-30 10:03.

最後に、-InputObjectの使用:

convertto-json -InputObject @(1)
[
  1
]

convertto-json -InputObject @() 
[]

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

Netflixのジョエルマクヘイルとのジョエルマクヘイルショーは、ジョエルマクヘイルにぴったりの車を復活させます

Netflixのジョエルマクヘイルとのジョエルマクヘイルショーは、ジョエルマクヘイルにぴったりの車を復活させます

ジョエル・マクヘイル、マイク・コルター(スクリーンショット:Netflix)「私の神よ、これは1つのことを変えます。」これは、ジョエル・マクヘイルとのジョエル・マクヘイルショーの最後のジョークです。リアリティ番組の嘲笑と寛大なスナキネスの時間は、なじみのある顔を見つけます。

チームロケットは20年ぶりにポケモンシリーズでアッシュを破った

チームロケットは20年ぶりにポケモンシリーズでアッシュを破った

画像経由:@pancakeparadox(Twitter)。1997年にポケモンシリーズが初公開されて以来、チームロケット(またはラテンアメリカではチームロケット)として知られる悪役のグループは、何度もアッシュに直面してきました。

今週の科学技術でトランプがめちゃくちゃになったことすべて

今週の科学技術でトランプがめちゃくちゃになったことすべて

画像:ゲッティ私たち全員が千年もの間生きていて、私たちの体が燃える風によってほこりと長引く悲鳴だけに押し流されたと考えるのは驚くべきことです。私たちがそうしていないことを除いて、それはトランプ政権の最初の週の終わりであり、驚くほど多くの恐ろしいことがすでに起こっています。

あなたの「マイクロピッグ」が代わりに通常のピッグになってしまったとしても驚かないでください

あなたの「マイクロピッグ」が代わりに通常のピッグになってしまったとしても驚かないでください

そして今、あることを手に入れていると思っていたが、まったく別のことをしてしまった男の話。CBSニュースは、彼女が「ミニブタ」であるという誤ったふりをしてエスターを養子にしたカナダ人のスティーブジェンキンスの心温まる物語をもたらします。これは、特にせいぜいゴールデンレトリバーまたはセントバーナードをストラップします。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language