PowerShell ConvertTo-Json 文字数制限 によってデータが途中で省略され、正しい JSON が出力されない問題に悩んだ経験はありませんか?特に API 連携や大容量オブジェクトの JSON 化を行う際に頻発します。
本記事では、PowerShell の ConvertTo-Json で起きる文字数制限問題の原因と、実務で使える解決方法を徹底解説します。
ConvertTo-Json の文字数制限が発生する原因
✔ 1. 既定では深さ (-Depth) が 2 に制限されている
PowerShell の ConvertTo-Json は、デフォルトでは 階層の深さが 2 に制限されています。
そのため、深い階層のデータは "..." に省略され、結果として実質的に文字制限のような状態になります。
▼ 例:階層が深いオブジェクトの場合
▼ 出力結果(省略)
✔ 2. PowerShell 5.x 以前では JSON の最大展開サイズが小さい
PowerShell 5.x 以前では内部的に制限がキツく、特に大量データを扱うと 途中で切れる(省略される) ことがあります。
これは純粋な文字数制限というより、PowerShell 内部のオブジェクト展開の限界です。
解決方法:ConvertTo-Json の出力制限を回避する方法
① -Depth を十分大きく指定する
最も重要な対策は -Depth の指定です。
-
API 連携など階層が深い可能性がある場合は 99 にするのが現場の定番
-
省略されている
"..."表示を回避できる
② JSON を整形せず出力する(-Compress を使う)
スペースや改行が多いとサイズが膨らむため、圧縮して出力することで回避できることがあります。
③ PowerShell 7 以降の使用を検討する
PowerShell 7 以降では、JSON 出力仕様が改善され、より大規模なデータ扱いが可能。
| バージョン | 特徴 |
|---|---|
| Windows PowerShell 5.1 | JSON の階層と容量制限が比較的厳しい |
| PowerShell 7+ | 省略の発生確率が低く高速処理可能 |
④ 文字列を一旦 Out-String+エンコードで処理する回避策
どうしても切れる場合、文字列にしてしまうテクニックがあります。
または Base64 化して転送するケースもあります。
よくある事例:Web API 送信時に途中で切れる
REST API に JSON データを送ろうとして以下のケースが多発します。
解決例
まとめ
| 発生原因 | 具体的解決策 |
|---|---|
| 階層深度制限 (Depth = 2) | ConvertTo-Json -Depth 99 |
| JSON の膨張 | -Compress を利用 |
| PowerShell 旧バージョン利用 | PowerShell 7 へ移行 |
| 大容量データ送信 | Out-String や Base64 変換 |
ConvertTo-Json の文字制限問題の多くは -Depth 99 で解決します。
業務の JSON 送信・ログの生成・API システム連携で必須の知識です。
