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

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

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

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

Python 3.x

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

Q&A

解決済

2回答

182閲覧

Pythonを使用したjsonへの書き込みについて

TanakashiXr

総合スコア57

JSON

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

Python 3.x

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

0グッド

1クリップ

投稿2019/01/14 13:12

編集2019/01/15 01:43

前提・実現したいこと

Pythonからjsonファイルへテキストの書き込みをしているのですが、思い通りいきません。
角括弧が必要ないところに入ってしまいます。

以下が実現したいことです

{ "mid": 1, "mid": 2, [ "mail", "password" ] "mid": 1 }

追記
以下の別のプログラムで使用する際に不便なので、今回このような質問をさせていただきました。

fin = open('loginmid.txt') loginmid = fin.read() fin.close() f=codecs.open('loginsetting.json','r','utf-8') loginsetting = json.load(f) loset = loginsetting[loginmid] if loset == 1: pass if loset == 2: pass if loset == 3: pass

発生している問題・現状

"mid": 1, "mid": [ 2, [ "mail", "password" ] ], "mid": 1,

該当のソースコード

f=codecs.open('loginsetting.json','r','utf-8') loginsetting = json.load(f) sender = mid msg.text = "2 mail password" zz = msg.text.replace("2 ","") ll = zz.split(" ") loginsetting[sender] = 2,ll f=codecs.open('loginsetting.json','w','utf-8') json.dump(loginsetting, f, sort_keys=True, indent=4,ensure_ascii=False)

どなたか、原因の分かる方いらっしゃればご教授お願いします

その後。。。

回答をいただき、二通りのことを考えました。

まず、jsonへの記載の仕方を変える方法です。

こちら試して見たところ、文字列とリストを合わせることができずエラーが発生しました。

エラー

[ ERROR ] list indices must be integers or slices, not str

理想

{ "mid":{ "number": 1 } "mid":{ "number": 2, "mail": "mail", "password": "password" } "mid":{ "number": 1 } }

該当のソースコード

f=codecs.open('loginsetting.json','r','utf-8') loginsetting = json.load(f) sender = mid msg.text = "2 mail password" zz = msg.text.replace("2 ","") ll = zz.split(" ") mail = ll[0] pas = ll[1] loginsetting[sender]["number"] = 2 loginsetting[sender]["mail"] = mail loginsetting[sender]["password"] = pas f=codecs.open('loginsetting.json','w','utf-8') json.dump(loginsetting, f, sort_keys=True, indent=4,ensure_ascii=False)

そして次に回答に頂いた、現在に相応した判定方法に変えるやり方です

loset値が2だった場合の判定方法を分からず、悩んでおります。

loginsetting

1{ 2 "mid1": 1, 3 "mid2": [ 4 2, 5 [ 6 "mail", 7 "password" 8 ] 9 ], 10 "mid3": 1, 11 "mid4": 1 12}

loginmid

1mid2
fin = open('loginmid.txt') loginmid = fin.read() fin.close() f=codecs.open('loginsetting.json','r','utf-8') loginsetting = json.load(f) print(loginsetting[loginmid]) if loginsetting[loginmid] == 1: pass if loginsetting[loginmid] == 2: pass if loginsetting[loginmid] == 3: pass

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

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

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

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

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

LouiS0616

2019/01/14 13:14 編集

『実現したいこと』の例がJSONの文法に違反しているように思えます。 なぜ現状の出力を変更したいのでしょうか?
can110

2019/01/15 01:22

最後のソースで読み込んでいる~.jsonファイル内容とloginmid変数値(例)を提示ください。
can110

2019/01/15 01:31

提示された.jsonファイルだと「{}」で囲まれていないためか、コード実行すると json.decoder.JSONDecodeError: Extra data: line 1 column 11 (char 10) が発生しますが、そちらの環境では正常に読み込めますか?
TanakashiXr

2019/01/15 01:32

申し訳ございません。 間違えておりました。
can110

2019/01/15 01:34

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 11 column 1 (char 137) が発生します。実際に使っているファイルからそのまま全コピペしてください。
TanakashiXr

2019/01/15 01:44

実際に使っているファイルは1万行を超えて、とても長いテキストとなるのと個人情報が含まれているため上記記載の通りとさせていただきます。 申し訳ございません。
can110

2019/01/15 01:45

了解しました。修正された.jsonだと正常に読み込めました。
guest

回答2

0

ベストアンサー

KSwordOfHasteさんが回答で示された判定方法でよいはずです。
以下、検証コードです。

Python

1import json,codecs 2f=codecs.open('loginsetting.json','r','utf-8') 3loginsetting = json.load(f) 4f.close() 5 6for loginmid in ['mid1','mid2','mid3','mid4']: 7 print(loginmid) 8 loset = loginsetting[loginmid] 9 print(loset) 10 for i in range(3): 11 if (loset if isinstance(loset, int) else loset[0]) == i: 12 print('loset == {}'.format(i)) 13 14""" 15mid1 161 17loset == 1 18mid2 19[2, ['mail', 'password']] 20loset == 2 21mid3 221 23loset == 1 24mid4 251 26loset == 1 27"""

投稿2019/01/15 01:49

can110

総合スコア38233

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

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

TanakashiXr

2019/01/15 02:31

こちらは動作致しました!ありがとうございます! 余談で申し訳ございません。 settinglogin.jsonにあります、こちら「[2, ['mail', 'password']]」の部分、mailとpasswordのみを取り除くにはどうすればよろしいでしょうか?
can110

2019/01/15 02:36

取り除くのではなく、mailとpassword以降を取り出したいと考えると dat = [2, ['mail', 'password',…]]である場合なら dat[1][2:]で[…]以降が取り出せます。
guest

0

原因

jsonの仕様です。ある意味JavaScriptのオブジェクトの仕様、あるいはPythonのdictの仕様ともいえましょう。

おそらくPythonのtupleの略記法

loginsetting[sender] = 2, ["mail", "password"]

の右辺がそのままJSONになってほしいということなのだと思います。Pythonのこの記法は便利ですが、あくまで略記法であり、意味的には

loginsetting[sender] = (2, ["mail", "password"])

なのですがその点が曖昧だったのではないでしょうか?上記の代入後、

if loginsetting[sender] == 2:

は成立しないことにご注意ください。お望みの判定は

if loginsetting[sender][0] == 2:

と書くことになります。


というわけで、ご質問のことで悩むのは止めて今のdump結果をあるがままに受け止めることをお勧めします。Louis0616さんの質問コメントの指摘のとおり質問者さんがお望みのような形式はJSONの仕様から逸脱しており、書くことも読むこともできません。

loginsetting[sender]が

・単なる整数スカラーの場合
・整数とメールアドレス、パスワードを含んだlistの場合

の両方あると想定するなら

python

1ls = loginsetting[sender] 2if (ls if isinstance(ls, int) else ls[0]) == 2: 3 ...

など、それ相応の判定方法が考えられるはずです。その方向で考えてみてください。

投稿2019/01/14 17:50

KSwordOfHaste

総合スコア18392

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問