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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

2回答

5188閲覧

Jsonでの要素の追加に関して

_Haru_

総合スコア4

JSON

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2020/11/17 15:16

json

1{ 2 "JPmJc": { 3 "information": { 4 "guild_id": 1111111111111, 5 "owner": "<@640391313153327125>さん", 6 "name": "テスト大会", 7 "type": "トーナメント戦", 8 "format": "個人戦", 9 "team-limit": "1人", 10 "permission": "許可する" 11 }, 12 "status": false, 13 "participates": [], 14 "result": [] 15 }, 16 // ここでワンセット 17 "Txja7": { 18 "information": { 19 "guild_id": 1111111111111, 20 "owner": "<@640391313153327125>さん", 21 "name": "テスト大会2", 22 "type": "トーナメント戦", 23 "format": "個人戦", 24 "team-limit": "1人", 25 "permission": "許可する" 26 }, 27 "status": false, 28 "participates": [], 29 "result": [] 30 } 31}

このような感じで1セットごとにJsonに追記していきたいのですが、追記をしようとすると上書きされ、いろいろ試してみたのですがわからなかったので質問させてください。

python

1 def upload(self): 2 file_path = 'cogs/save/information.json' 3 with codecs.open(file_path, 'r', 'utf-8') as f: 4 fw = json.load(f) 5 6 save = fw[self.info[1]] = {} 7 save["information"] = { 8 "guild_id": self.info[0], 9 "owner": self.info[2], 10 "name": self.info[3], 11 "type": self.info[4], 12 "format": self.info[5], 13 "team-limit": self.info[6], 14 "permission": self.info[7], 15 } 16 save["status"] = False 17 save["participates"] = [] 18 save["result"] = [] 19 20 with codecs.open(file_path, 'w', 'utf-8') as f: 21 json.dump(fw, f, ensure_ascii=False, indent=2)

python

1Traceback (most recent call last): 2 File "*****************", line 333, in _run_event 3 await coro(*args, **kwargs) 4 File "*****************", line 319, in on_raw_reaction_add 5 await conform_competition_information() 6 File "*****************", line 282, in conform_competition_information 7 data.upload() 8 File "*****************", line 30, in upload 9 json.dump(fw, f, ensure_ascii=False, indent=2) 10 File "*****************", line 179, in dump 11 for chunk in iterable: 12 File "C:\Users********\AppData\Local\Programs\Python\Python36\lib\json\encoder.py", line 430, in _iterencode 13 yield from _iterencode_dict(o, _current_indent_level) 14 File "C:\Users********\AppData\Local\Programs\Python\Python36\lib\json\encoder.py", line 404, in _iterencode_dict 15 yield from chunks 16 File "C:\Users********\AppData\Local\Programs\Python\Python36\lib\json\encoder.py", line 340, in _iterencode_dict 17 raise ValueError("Circular reference detected") 18ValueError: Circular reference detected

self.info にはtupleで情報が入っていて、それを上のJson形式に直したいのですが、先ほど述べたように上書きされてしまったため色々調べた挙句この動かないコードにたどり着きました。また、特に7~15行目の部分がいいコードをかけている自信がなく、Jsonの書き方を同時に指導してくださるとありがたいです。

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

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

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

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

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

guest

回答2

0

save = fw[self.info[1]] = {}の部分が構文的にもおかしいように思います。
素直に書けばいいかと。

python

1 fw[self.info[1]] = { 2 "information": { 3 "guild_id": self.info[0], 4 "owner": self.info[2], 5 "name": self.info[3], 6 "type": self.info[4], 7 "format": self.info[5], 8 "team-limit": self.info[6], 9 "permission": self.info[7], 10 }, 11 "status": False, 12 "participates": [], 13 "result": [] 14 }

投稿2020/11/17 21:53

bsdfan

総合スコア4794

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

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

_Haru_

2020/11/18 09:45

めちゃくちゃ面倒くさいことをやっていたんですね...。 ありがとうございます。めちゃくちゃ見やすくなりました!
guest

0

Python

1codecs.open(file_path, 'w', 'utf-8')

上記コードは、上書きモードなので、以下のように、追記モードを指定すれば良いかと。

Python

1codecs.open(file_path, 'a', 'utf-8')

Pythonでファイルの読み込み、書き込み

投稿2020/11/17 16:37

YT0014

総合スコア1750

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問