質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

3237閲覧

Powershell で ネストされたデータを JSON(XML)で扱いたい

kamikazelight

総合スコア305

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2018/11/20 06:05

前提・実現したいこと

ネストされたデータを外部ファイルに保存し
利用時にPsObjectに変換して使いたいです。

JSONを使ってみようとしたのですが
ネストしたデータが消えてしまいます。
どうしたらいいでしょうか?

今 JSON を使おうとしていますが
XML の方が適しているのであればそちらを使いたいです。

今までCSV しか使ったことが無いので
JSONはKeyの表記が一回で済むから XMLより書くのが楽なんだな
くらいにしかわかっていません。

発生している問題

ネストされたデータをJSONで扱う方法が分からない。

該当のソースコード

PowerShell

1 2# サンプルデータをかさまし... 3$FormatInfo = 0..2 | foreach ` 4{ 5 $Info = [PSCustomObject]@{ 6 TypeName = '部品表' 7 FrameItem = @( 8 [PSCustomObject]@{ 9 Name = "担当" 10 Range = [PSCustomObject]@{ 11 Address = 'AN49:AQ55' 12 Row = 49 13 Column = 40 14 } 15 }, 16 [PSCustomObject]@{ 17 Name = "製図初年月日" 18 Range = [PSCustomObject]@{ 19 Address = 'AW53:BC55' 20 Row = 53 21 Column = 49 22 } 23 }, 24 [PSCustomObject]@{ 25 Name = "製図年月日" 26 Range = [PSCustomObject]@{ 27 Address = 'BD53:BJ55' 28 Row = 53 29 Column = 56 30 } 31 }, 32 [PSCustomObject]@{ 33 Name = "盤名称" 34 Range = [PSCustomObject]@{ 35 Address = 'BN47:CB49' 36 Row = 47 37 Column = 66 38 } 39 }, 40 [PSCustomObject]@{ 41 Name = "管理番号" 42 Range = [PSCustomObject]@{ 43 Address = 'CJ47:CU48' 44 Row = 47 45 Column = 88 46 } 47 }, 48 [PSCustomObject]@{ 49 Name = "件名" 50 Range = [PSCustomObject]@{ 51 Address = 'CG49:CU51' 52 Row = 49 53 Column = 85 54 } 55 }, 56 [PSCustomObject]@{ 57 Name = "件名1" 58 Range = [PSCustomObject]@{ 59 Address = 'CG52:CU55' 60 Row = 52 61 Column = 85 62 } 63 }, 64 [PSCustomObject]@{ 65 Name = "図面名称" 66 Range = [PSCustomObject]@{ 67 Address = 'AW47:BJ49' 68 Row = 47 69 Column = 49 70 } 71 } 72 ) 73 Title = @( 74 [PSCustomObject]@{ 75 Name = "頁" 76 Range = [PSCustomObject]@{ 77 Address = 'M9:P9' 78 Row = 9 79 Column = 13 80 } 81 }, 82 [PSCustomObject]@{ 83 Name = "CharacterSymbol" 84 Range = [PSCustomObject]@{ 85 Address = 'Q9:W9' 86 Row = 9 87 Column = 17 88 } 89 }, 90 [PSCustomObject]@{ 91 Name = "PartsNo" 92 Range = [PSCustomObject]@{ 93 Address = 'X9:Z9' 94 Row = 9 95 Column = 24 96 } 97 }, 98 [PSCustomObject]@{ 99 Name = "EquipmentName" 100 Range = [PSCustomObject]@{ 101 Address = 'AA9:AO9' 102 Row = 9 103 Column = 27 104 } 105 }, 106 [PSCustomObject]@{ 107 Name = "TypeRated" 108 Range = [PSCustomObject]@{ 109 Address = 'AP9:CK9' 110 Row = 9 111 Column = 42 112 } 113 }, 114 [PSCustomObject]@{ 115 Name = "Quantity" 116 Range = [PSCustomObject]@{ 117 Address = 'CL9:CO9' 118 Row = 9 119 Column = 90 120 } 121 }, 122 [PSCustomObject]@{ 123 Name = "Maker" 124 Range = [PSCustomObject]@{ 125 Address = 'CP9:CU9' 126 Row = 9 127 Column = 94 128 } 129 } 130 ) 131 LineCount = 35 132 LineInterval = 1 133 ShName = '部品表' 134 BookName = '部品表.xlsm' 135 Path = "" 136 } 137 $Info 138} 139 140# PSCustomObject を JSON に変換 141$JSON = ConvertTo-Json -InputObject $FormatInfo 142 143# JSON から PSCustomObject を復元 144$PSCustomObject = ConvertFrom-Json $JSON 145 146Clear-Host 147 148# ちゃんとある 149Write-host "`$FormatInfo[0].Title[0].Range.Address : '$($FormatInfo[0].Title[0].Range.Address)'" 150 151# 消えてる.... 152Write-host "`$PSCustomObject[0].Title[0].Range.Address : '$($PSCustomObject[0].Title[0].Range.Address)'" 153

試したこと

  1. JSONの書き方が全く分からなかったので一先ずPSCustomObjectで記述して

ConvertTo-Jsonを使いJSONに変換
0. ネストしたデータが消えていることに気づき
なんとなくJSONの書き方が分かった気がしたのでJSONで書いて
ConvertFrom-Jsonを使いPSCustomObjectに変換を試みて失敗...

powershell

1$JSON = @' 2[ 3 { 4 "Title": [ 5 { 6 "Name":"頁" 7 "Range": { 8 "Address": "AN49:AQ55" 9 "Row": 49 10 "Column": 40 11 } 12 } 13 ] 14 }, 15 { 16 "Title": [ 17 { 18 "Name":"頁" 19 "Range": { 20 "Address": "AN49:AQ55" 21 "Row": 49 22 "Column": 40 23 } 24 } 25 ] 26 } 27] 28'@ 29 30# JSON から PSCustomObject に変換...しようとしたができない 31$PSCustomObject = ConvertFrom-Json $JSON

補足情報(FW/ツールのバージョンなど)

Win10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

ConvertTo-JsonにはJSONのネストの階層を指定する-Depthパラメーターがあります。(デフォルト2)

# PSCustomObject を JSON に変換 $JSON = ConvertTo-Json -InputObject $FormatInfo

の部分を

# PSCustomObject を JSON に変換 $JSON = ConvertTo-Json -InputObject $FormatInfo -Depth 4

の様に適切な値にしてみてください。
(例示のソースだと4で十分ですが、実データでは適宜値を変えてください。)

試したこと について

"試したこと"で例示しているJSONはカンマが抜けており正しくありません。

$JSON = @' [ { "Title": [ { "Name": "頁", "Range": { "Address": "AN49:AQ55", "Row": 49, "Column": 40 } } ] }, { "Title": [ { "Name": "頁", "Range": { "Address": "AN49:AQ55", "Row": 49, "Column": 40 } } ] } ] '@

なら動作するかと。

投稿2018/11/20 09:50

stknohg

総合スコア796

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamikazelight

2018/11/20 22:25

カンマが必要だったのですね 変換時階層数の指定が必要になるなんて全く想像していませんでした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問