【問題】
.jsonファイルを作って、Pythonのjsonモジュールのload()メソッドでjsonの内容をdict型で取得しようと思ったら、以下の内容のエラーが出るでござる
# 前略 File "myapp.py", line 5, in load pool = json.load(f) File "/usr/lib/python2.6/json/__init__.py", line 267, in load parse_constant=parse_constant, **kw) File "/usr/lib/python2.6/json/__init__.py", line 307, in loads return _default_decoder.decode(s) File "/usr/lib/python2.6/json/decoder.py", line 319, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib/python2.6/json/decoder.py", line 336, in raw_decode obj, end = self._scanner.iterscan(s, **kw).next() File "/usr/lib/python2.6/json/scanner.py", line 55, in iterscan rval, next_pos = action(m, context) File "/usr/lib/python2.6/json/decoder.py", line 171, in JSONObject raise ValueError(errmsg("Expecting property name", s, end)) ValueError: Expecting property name: line 2 column 3 (char 4)
【ソース】
myapp.py
import json parsed_dict = {} with open('sample.json','r') as f: parsed_dict = json.load(f) print parsed_dict
sample.json
{ 'echo' : '( *A*) < This is Echo Value!!' }
ででーん
【調査1】
英語ばっかりだぜぇ〜
よく分からないぜぇ〜。とりあえず、jsonファイルの書式がイケないっぽい感ございますね。それ以上の情報が無い感ございますね。
【調査2】
しょうがないからjsonモジュールのソース読むぜぇ〜。Error出力に、
# 前略 File "/usr/lib/python2.6/json/decoder.py", line 171, in JSONObject raise ValueError(errmsg("Expecting property name", s, end)) ValueError: Expecting property name: line 2 column 3 (char 4)
とあるので、/usr/lib/python2.6/json/decoder.py :171 を見に行こう! /usr/lib/python2.6/json/decoder.py :171
162 def JSONObject(match, context, _w=WHITESPACE.match): 163 pairs = {} 164 s = match.string 165 end = _w(s, match.end()).end() 166 nextchar = s[end:end + 1] 167 # Trivial empty object 168 if nextchar == '}': 169 return pairs, end + 1 170 if nextchar != '"': 171 raise ValueError(errmsg("Expecting property name", s, end)) 172 end += 1 173 encoding = getattr(context, 'encoding', None) 174 strict = getattr(context, 'strict', True) 175 iterscan = JSONScanner.iterscan
nextchar = s[end:end+1]から分かるように、一文字一文字パースしてる部分っぽい。170行目の分岐に入ってるので、171のraiseが発火してるわけで、170行目は、文字が'"(ダブルクオート)'じゃなかったらってことなので、どうやらシングルクオートでjsonのkeyやvalueをくくってはいけない?
【解決】
jsonファイルのシングルクオートを全部ダブルクオートにしたら治った
{ "echo" : "( *A*) < This is Echo Value!!" }
【雑感】
あと、jsonの書式関係でつまずきやすいのは、最後の要素の末尾についつい要らない,(カンマ)入れちゃうケース
DRY