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

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

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

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

Python

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

Q&A

解決済

1回答

4075閲覧

json形式のファイルを出力したい

rtakar

総合スコア21

JSON

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

Python

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

0グッド

0クリップ

投稿2017/05/29 08:50

編集2017/05/30 00:55

###前提・実現したいこと
json形式のファイルを出力したい

###発生している問題・エラーメッセージ
出力すると形が変わってしまいました。
コマンドライン上では正しく出力されるのですが、
ファイルとして出力すると余計な記号がついてしまいます。
これ正しく出力したいのですが、何が原因なのでしょうか

python

1# htmlのscriptに乗っているjsonデータをとってきています 2 script = soup.find_all("script", {"type": "text/javascript"})[1].get_text() 3 data = json.dumps(script) # 確認用 4 print(json.loads(data)) # 確認用 5 with open("Output.json", "w") as f: 6 json.dump(script, f, indent=4)
# json.dumpの時の出力 {"activity_counts": null, ===hoge===
# json.dumpsの時の出力Output.json "{\"activity_counts\": null, ===hoge===

###追記:

python

1 print(json.loads(data)) # 確認用

python

1 print(data) # 確認用 2

に変更したところ、output.jsonと同じ形になりました。
jsonの形として不要な「\」や「”」などを除去したいのですが、原因と方法が知りたいです

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

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

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

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

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

guest

回答1

0

ベストアンサー

状況を読み間違えてました。回答を訂正しました


Python

1 script = soup.find_all("script", {"type": "text/javascript"})[1].get_text()

scriptに代入されているのは文字列ですよね。
json.dumpsはPythonの「オブジェクト」を「JSON文字列に」変換します。
このため、Pythonの「文字列型のデータ」はJSONの「文字列型のデータ」に変換されます。

Python

1>>> print(json.dumps('"hello"')) 2"\"hello\""

提示されている例で言うと以下のようになります。

Python

1>>> script = '{"activity_counts": null, "dummykey": "dummyvalue"}' 2>>> print(json.dumps(script)) 3"{\"activity_counts\": null, \"dummykey\": \"dummyvalue\"}"

これは、scriptに格納されているのが「すでにJSON表現の文字列」なのをさらにJSONに変換しているために上記のような結果になっています。
scriptが「すでにJSON」ならば、ここから2の対処方法が考えられます。

A: 特にPythonオブジェクトとして操作したいことがないのでそのまま出力する

Python

1>>> with open("Output.json", "w") as f: 2... f.write(script)

B: Pythonとして処理するために一旦Pythonのデータ型に変換する

Python

1>>> data = json.loads(script) 2>>> data 3{'activity_counts': None, 'dummykey': 'dummyvalue'} 4>>> print(json.dumps(data)) 5{"activity_counts": null, "dummykey": "dummyvalue"} 6>>> # ここでdataに対してなにか操作をする 7>>> with open("Output.json", "w") as f: 8... json.dump(data, f, indent=4)

以前の回答(scriptにPythonの文字列ではない型のデータが入っていると読み違えました)

Python

1 print(json.loads(data)) # 確認用

これが期待している処理と違ってそうです。
ファイルの中身と見比べるのであれば、dumpsしたものをプリントするべきでしょう。
以下のように書いてみてください。

Python

1 print(data) # 確認用

投稿2017/05/29 09:49

編集2017/05/30 01:05
shimizukawa

総合スコア1847

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

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

rtakar

2017/05/30 00:49

dumpsしたものをプリントした結果output.jsonの形で出てきました。 これを余計な\や”を除いた形で出力することはできないのでしょうか?
shimizukawa

2017/05/30 00:53

あー、状況を読み間違えてました。 script は文字列型ですよね。文字列型をjson.dumpsしたらそのようになります。回答を更新します。
rtakar

2017/05/30 01:16

おかげさまでjson型のファイルを出力することができました。 訂正も含めてご親切に回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問