DRYな備忘録

Don't Repeat Yourself.

Expecting property name: line 2 column 3 (char 4)【json】【Python】

【問題】

.jsonファイルを作って、Pythonjsonモジュールの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!!'
}

ででーん

f:id:otiai10:20130715160252p:plain

【調査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