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

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

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

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

Q&A

4回答

6389閲覧

JSONデータをcsv出力

krg

総合スコア8

JSON

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

0グッド

0クリップ

投稿2017/06/16 02:37

他システムとの連携で、渡されるJSONデータを最終的にCSVとして出力したいです。
受け取るデータは以下のような形式です。

{
"hoge1":{
"A":1,
"B":2,
"C":"foo",
"D":"2017-01-01 10:10:10"
},
"hoge2":{
"A":4,
"B":5,
"C":"bar",
"D":"2007-02-02 12:12:12"
}
}

これを、

"hoge1",1,2,"foo","2017-01-01 10:10:10"
"hoge2",4,5,"bar","2007-02-02 12:12:12"

のようにしたいです。

jq等を使えばシンプルに表現できるかと思い、試してみましたがうまくいきませんでした。
実行環境については、OSX上で完結すると助かりますが、Windows、Linux(ないしBSD)環境も用意できます。
お知恵を借りられれば幸いです。

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

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

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

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

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

guest

回答4

0

別途コマンドをOSにインストールするという観点で考えると、jqを利用するのであれば、jsonパーサをもつスクリプト言語を利用するのが簡単ではないでしょうか。

別コマンドをインストールしたくないということであれば、若干の汎用性を犠牲にして、sed・awk等を利用すると良いかと思います。
json自体が他のシステムからということで、提示されたJSONからkey名称などが頻繁に変わったりしないという想定

上記2つの選択肢ともにOSX上で完結しますし、すでに解答例が提示されているようです。

投稿2017/06/16 05:30

t_obara

総合スコア5488

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

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

0

投稿2017/06/16 04:08

tkturbo

総合スコア5572

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

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

krg

2017/06/16 04:37

ありがとうございます。 link先のサイトは参照した上で、1hほど試行したのですが望んだ出力が得られなかった為、質問させて頂いた次第です。
guest

0

Linux の sed を用いるとこんな感じでしょうか。
もっと効率よくかけるかもしれません。

sh

1 2$ cat test.json 3{ 4 "hoge1":{ 5 "A":1, 6 "B":2, 7 "C":"foo", 8 "D":"2017-01-01 10:10:10" 9 }, 10 "hoge2":{ 11 "A":4, 12 "B":5, 13 "C":"bar", 14 "D":"2007-02-02 12:12:12" 15 } 16} 17 18$ cat test.json | 19 tr -d "\n" | # 全ての改行を削除(LFを想定) 20 sed "s/\"[A-D]\"://g" | # AからD のキーを除外 21 sed "s/\":/\",/g" | # "hogeN": キー の ": を ", に置換 22 sed "s/{//g" | # { を削除。 23 sed "s/}\|},/\n/g" | # } を 改行に置換 24 sed "s/, \+/,/g" | # カンマ後ろの余分な空白を削除 25 sed "s/^ \+//g" > test.csv # 先頭の余分な空白を削除し、test.csv に出力 26 27## 出来上がりの例 28$ cat test.csv 29"hoge1",1,2,"foo","2017-01-01 10:10:10" 30"hoge2",4,5,"bar","2007-02-02 12:12:12" 31

投稿2017/06/16 05:01

tukuroku

総合スコア234

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

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

0

CSVとして出力したい

というのはファイルに保存するUIまで付けたいということでしょうか?
とりあえず変換だけであればベタにループで処理してみてはいかがでしょうか?

javascript

1var a={ 2 "hoge1":{ 3 "A":1, 4 "B":2, 5 "C":"foo", 6 "D":"2017-01-01 10:10:10" 7 }, 8 "hoge2":{ 9 "A":4, 10 "B":5, 11 "C":"bar", 12 "D":"2007-02-02 12:12:12" 13 }, 14} ; 15var b=""; 16for(var i in a){ 17 b+="\""+i+"\""; 18 for(var j in a[i]){ 19 var val=a[i][j]; 20 if(typeof val!="number") val="\""+val+"\""; 21 b+=","+val; 22 } 23 b+="\n"; 24} 25console.log(b); 26

投稿2017/06/16 03:25

yambejp

総合スコア114742

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

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

krg

2017/06/16 04:43

ご回答ありがとうございます。 出力は標準出力の想定です。 ご指摘頂いております通り、現在はshellのループ処理で当座の対応としております。 しかしながら、保守性の観点からシンプルにまとめられないかと思って質問をさせて頂いておりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問