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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JSON

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

7118閲覧

ネストされたJSONのCSV変換

tij8og1n9nm8

総合スコア5

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JSON

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/18 15:21

前提・実現したいこと

ネストされた以下のようなJSONをCSVに変換したいのですが、いろいろ試してみたものの、どう扱っても上手く処理できません。

どなたか変換する方法をご教授頂けないでしょうか。

JSON

1{ 2 "masterNumber": 10000, 3 "code": "m-001", 4 "customerData": { 5 "name": "Jiro", 6 "age": 45 7 }, 8 "Address": [{ 9 "name": "testAreport", 10 "email": "tA@sample.co.jp" 11 }], 12 "items": [{ 13 "itemId": "item01", 14 "itemName": "商品01" 15 }, 16 { 17 "itemId": "item02", 18 "itemName": "商品02" 19 }, 20 { 21 "itemId": "item03", 22 "itemName": "商品03" 23 }] 24}

csv

1"masterNumber","code","customerData__name","customerData__age","Address__name","Address__email","items__itemId","items__itemName" 2"10000","m-001","Jiro","45","testAreport","tA@sample.co.jp","item01","商品01" 3"","","","","","","item02","商品02" 4"","","","","","","item03","商品03"

試したこと

json_normalizeというモジュールを使ってみたのですが、期待する結果のように変換できませんでした。

Python

1import json 2from pandas.io.json import json_normalize #package for flattening json in pandas df 3 4sample_object = {'Name':'John', 'Location':{'City':'Los Angeles','State':'CA'}} 5json_normalize(sample_object)

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

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

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

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

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

meg_

2020/11/18 22:45

> 期待する結果のように変換できませんでした。 ではどうなったのでしょうか?
toast-uz

2020/11/18 22:50 編集

csvという手段は2次元の数値列や文字列を表現するものであって、「ネストされたJSON」を表現するのには適切ではないと思います。単にファイルに書き出したいだけであれば、JSONの形で書き出すべきです。いまの質問では、質問者様がcsvという手段を勘違いしているように思われますので、回答がつきにくいと思います。なぜcsvなのか、という目的・理由をもう少し記載ください。
tij8og1n9nm8

2020/11/19 14:03

アドバイスありがとうございます。 CSVというより、人が目視で大まかな内容を確認したいため、1次元に変換したいが意図になります。 背景としては以下の通りです。 * 検索条件を出力した大量のJSONファイルがある(形式も様々なため、クラス定義などは行えない) * その内容によって、営業アクションを行うため一覧形式で検索条件を確認したい * このため、JSON形式をそのまま見るのは辛いので、内容が把握できる程度に可読性をあげたい * 都合上、画面などを作るほどの工数や期間はないためなるべく省力で解決したい
toast-uz

2020/11/19 14:58 編集

質問者様の要望は、オブジェクト1つ1つを、1行1行で出力して、可読性と一覧性をあげたい、あまり工数をかけずに、ということですよね?csvかjsonかは本質的ではないと受け取りました。 普通にjson.dumpすると要望通りに出力されると思うのですが、試されたのでしょうか? csvで出力しようとしたらつまずいた、という情報だけで、jsonで出力しようとしたら何の課題があったのかが不明です。Pythonのjson出力は、例示されたようなキレイな形しかできないという勘違いがあるのでは?
guest

回答1

0

こういうときは、まず、シリアライズする必要がありますが、そんなときにはその構造(この場合はjson)をすべて舐める必要があります。そういう処理を「walk」と言います。

"python json walk"で検索して最初に出てきたサイトからもらった処理がこれです。
スタックオーバーフローでした

python

1def dict_generator(indict, pre=None): 2 pre = pre[:] if pre else [] 3 if isinstance(indict, dict): 4 for key, value in indict.items(): 5 if isinstance(value, dict): 6 for d in dict_generator(value, pre + [key]): 7 yield d 8 elif isinstance(value, list) or isinstance(value, tuple): 9 for v in value: 10 for d in dict_generator(v, pre + [key]): 11 yield d 12 else: 13 yield pre + [key, value] 14 else: 15 yield pre + [indict] 16

↑これを使って、↓こんな処理をすると、

python

1with open('sample.json', 'r', encoding='utf-8') as f: 2 d = json.load(f) 3 4x = list(dict_generator(d, []))

xはこうなります。

text

1[['masterNumber', 10000], 2 ['code', 'm-001'], 3 ['customerData', 'name', 'Jiro'], 4 ['customerData', 'age', 45], 5 ['Address', 'name', 'testAreport'], 6 ['Address', 'email', 'tA@sample.co.jp'], 7 ['items', 'itemId', 'item01'], 8 ['items', 'itemName', '商品01'], 9 ['items', 'itemId', 'item02'], 10 ['items', 'itemName', '商品02'], 11 ['items', 'itemId', 'item03'], 12 ['items', 'itemName', '商品03']]

各リストの最後が値で、残りがデータのパスになっています。
ここからデータを抽出して、csvに書き出せばできますね。

投稿2020/11/19 11:18

TakaiY

総合スコア13790

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問