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

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

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

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

Q&A

解決済

3回答

6959閲覧

JSON→辞書に綺麗に整形したい。

pokemonta

総合スコア170

JSON

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

0グッド

0クリップ

投稿2020/09/03 13:03

編集2020/09/03 13:05

Untitled-9.jsonをインプットにjson→dict.pyを実行した結果以下のような出力結果となります。
『\n 』の部分が残り、うまく階層構造を表現できません。
綺麗に階層表示(\nで改行して半角スペース4つあける)する方法がありましたらご教示願います。

環境:Python3
OS:windows10

◆Untitled-9.json

{"sourcesContent":["existingLambdaObj: this.lambdaFunction,\n dynamoTableProps: props.dynamoTableProps\n });\n this.dynamoTable = lambdaToDynamoDB.dynamoTable;\n }\n}"]}

◆json→dict.py

import json #JSON ファイルの読み込み f = open('Untitled-9.json', 'r') json_dict = json.load(f) print('json_dict:{}'.format(type(json_dict))) print(json_dict)

□出力結果

json_dict:<class 'dict'> {'sourcesContent': ['existingLambdaObj: this.lambdaFunction,\n dynamoTableProps: props.dynamoTableProps\n });\n this.dynamoTable = lambdaToDynamoDB.dynamoTable;\n }\n}']}

参考文献

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

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

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

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

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

quickquip

2020/09/03 14:38 編集

"綺麗に階層表示"では他人に伝わりません。 元のJSONからデータを変えてしまってもいい、データとして違うものになってもいい、Pythonのリテラルとして解釈できなくていい、とにかく見目よく出したいということでしょうか?
pokemonta

2020/09/03 21:54

『\n 』を取り除くことがデータが変わるということなんですね? 私は、てっきり辞書型に変換できれば自動で『\n 』が取り除かれると思っていました。 なぜなら、辞書型で処理するときにkeyを指定してvalueをgetしたいと思いますので 『\n 』が不要と考えたからです。 辞書型で『\n 』を残るのがよくわかっていません。 Stringならシリアルに扱いたいので『\n 』で改行というのがわかる方がいいと思いますが 辞書型って階層も表現されたものが出力されると考えていました。 なので辞書型で『\n 』が変換されると思っています。
guest

回答3

0

ベストアンサー

質問への追記・修正 欄

Stringならシリアルに扱いたいので『\n 』で改行というのがわかる方がいいと思いますが
辞書型って階層も表現されたものが出力されると考えていました。
なので辞書型で『\n 』が変換されると思っています。

json

1{"a": "b\nc"}

は名前"a""b\nc"という長さ3の文字列(1文字目が'b'、2文字目が改行文字、3文字目が'c')の値が紐付いたobject型のJSONです。
パースしたあとのPythonの用語だと「キー'a'に値'b\nc'が紐付いた辞書」ということになります。

python

1import json 2 3s = r'{"a": "b\nc"}' 4print(json.loads(s))

結果は

plain

1{'a': 'b\nc'}

です。

これはあたりまえで、

plain

1{'a': 'b 2c'}

などと出力されたらめちゃくちゃ困ります


質問のデータも同じで\nが入っているのは、JSONや辞書の構造の記述の部分ではなくて文字列の中なのです。
そこが勘違いしているポイントと推測します。

JSONの用語で言うと、object型の名前nameにarray型のデータが格納されていて、その最初の要素が文字列型で、その40番目の文字が改行です。

Pythonの用語で言うと、辞書型オブジェクトの'name'というキーにリスト型オブジェクトが紐付いていて、そのインデクス0番の要素が文字列型で、そのインデクス39番の部分文字列が改行です。

辞書内に含まれる文字列型なのですからそのままprintしたら\nで表示されることに不思議はありません。
文字列そのものをprintする時とはふるまいが違います。

python

1s = r'{"sourcesContent":["existingLambdaObj: this.lambdaFunction,\n dynamoTableProps: props.dynamoTableProps\n });\n this.dynamoTable = lambdaToDynamoDB.dynamoTable;\n }\n}"]}' 2d = json.loads(s) 3print(d) 4print(type(d['sourcesContent'][0])) 5print(repr(d['sourcesContent'][0][39])) 6print() 7print(d['sourcesContent'][0])

結果

plain

1{'sourcesContent': ['existingLambdaObj: this.lambdaFunction,\n dynamoTableProps: props.dynamoTableProps\n });\n this.dynamoTable = lambdaToDynamoDB.dynamoTable;\n }\n}']} 2<class 'str'> 3'\n' 4 5existingLambdaObj: this.lambdaFunction, 6 dynamoTableProps: props.dynamoTableProps 7 }); 8 this.dynamoTable = lambdaToDynamoDB.dynamoTable; 9 } 10}

\nではなく、

plain

1{"a": "b 2c"}

のように改行コードが入ると
Pythonとしてリテラルに解釈できない文法エラーを起こすコードであり、
JSONとして正しくないデータになってしまいます。

JSON仕様のstringのところを見てください。

except " or \ or control characters

制御コードを除くと書いてあります。ですから

python

1 2import json 3 4s = r'''{"a": "b 5c"}''' 6json.loads(s)

は正しくエラーになります。

plain

1json.decoder.JSONDecodeError: Invalid control character at: line 1 column 9 (char 8)

投稿2020/09/03 23:48

編集2020/09/04 01:36
quickquip

総合スコア11235

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

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

pokemonta

2020/09/04 00:26

めっちゃわかりやすいです。ありがとうございました。 明示的につけられています r'は、String dは、辞書型を表している理解でよろしいでしょうか? 私のサンプルプログラムには、r'をつけておりませんでした
quickquip

2020/09/04 01:35

d はコードで代入しているただの変数なので
pokemonta

2020/09/04 02:38

ありがとうございました。
guest

0

\nを取り除き整形しました。

Python

1import json 2 3with open('Untitled-9.json', 'r') as f: 4 s = f.read() 5 s = s.replace('\n','') 6 7json_dict = json.loads(s) 8 9sd = json.dumps(json_dict, indent=4) 10print(sd) 11#{ 12# "sourcesContent": [ 13# "existingLambdaObj: this.lambdaFunction, dynamoTableProps: #props.dynamoTableProps }); this.dynamoTable = lambdaToDynamoDB.dynamoTable; }}" 14# ] 15#}

投稿2020/09/03 15:12

meg_

総合スコア10760

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

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

0

json.dumps()を使います。

import json #JSON ファイルの読み込み f = open('Untitled-9.json', 'r') json_dict = json.load(f) print('json_dict:{}'.format(type(json_dict))) print(json.dumps(json_dict, ensure_ascii=False, indent=4))

投稿2020/09/03 13:19

sfdust

総合スコア1137

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

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

pokemonta

2020/09/03 13:23

実行致しました。 VSコードのターミナル上では、まだ、『\n 』が残っているようです。 json_dict:<class 'dict'> { "sourcesContent": [ "existingLambdaObj: this.lambdaFunction,\n dynamoTableProps: props.dynamoTableProps\n });\n this.dynamoTable = lambdaToDynamoDB.dynamoTable;\n }\n}" ] }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問