2012-02-08 3 views
26

JSONオブジェクトをPython dictに解析しようとしています。私は以前これをやったことがない。私はこの特定のエラーを見つけたときに(最初の文字に何か問題がありますか?)、ロードされている文字列は実際にはJSON文字列ではないとの他の投稿があります。しかし、これは確かです。PythonでJSONを解析しようとしています。 ValueError:プロパティ名を期待する

この場合、eval()はうまく動作しますが、より適切な方法があるのでしょうか?

注:この文字列は、Twitterから直接、pttツールを使用しています。

>>> import json 
>>> line = '{u\'follow_request_sent\': False, u\'profile_use_background_image\': True, 
     u\'default_profile_image\': False, 
     u\'verified\': False, u\'profile_sidebar_fill_color\': u\'DDEEF6\', 
     u\'profile_text_color\': u\'333333\', u\'listed_count\': 0}' 
>>> json.loads(line) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 326, in loads 
     return _default_decoder.decode(s) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode 
     obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode 
     obj, end = self.scan_once(s, idx) 
    ValueError: Expecting property name: line 1 column 1 (char 1) 
+8

これはPythonの構文であり、JSONではありません。安全な評価のために 'ast.literal_eval'を使用してください。 – JBernardo

答えて

28

これは間違いなくJSONではありません。これは既にPythonオブジェクトに解析されています.JSONはではなくfalseであり、ユニコードの文字列はすべてu(すべてのJSON文字列はUnicode)と表示されません。 jsonの文字列が既にチェーンのどこかで無料でPythonオブジェクトに変換されていないことを確かめているので、実際には文字列ではないので、json.loads()に読み込むのは間違っていますか?

+2

これはまさに問題でした。ありがとう。 – gabe

27

時々、あなたの文字列の値がpythonによってよく認識されないので、このエラーが出ることがあります。例として、私はこの種のエラーの原因を探すのにかなりの時間を費やしました。ここに私が見つけたものがあります。すべての引用符はJavaScriptでJSONに文字列を解析するために 'フォーマット

にする必要がJavaScriptでJSONにして文字列を解析するために、ところで :

は時々言語は、引用符の種類ではなく別のものを認識し、すべての引用符は本当にロジックではありません」の形式である必要はあり

うまくいけば、あなたは置き換える機能を使用することができますPythonのために:。。

json.loads(s.replace("\'", '"')); 

が、それはあなたに私はこれを狩猟費やしてきた時間を節約することを願っていますバグ!

+0

それは私が直面した問題です。ありがとう – Alireza

+0

JavaScriptでJSONの引用に関するあなたの答えの部分は少し矛盾しています。 JavaScriptの両方のバリエーション(Chrome版)を試してみました(https://jsbin.com/pupayajoni/1/edit?js,console)。結果は次のとおりです:3番目のパラグラフは正しい:標準のJavaScriptパーサーは、文字列リテラルの境界として単一引用符を使用できません。 –

+1

BTW [JSON仕様](http://www.json.org)では文字列を二重引用符で囲みます。この動作はJavaScriptとPython JSONパーサーに固有の動作ではありません。 –

7

プロパティのリストの最後にカンマがついているときにこのエラーが発生しました。カンマのために別のプロパティ名が必要ですが、何もありませんでした。

+1

JSONでコンマを末尾に置くことはできません。そして、json.loadはあなたに 'ValueError:Expecting Property Nameを二重引用符で囲みます – Ufos

0

JSONファイルの行の先頭が//であることを確認してください(コメントが間違っています!)。私は同じValueErrorメッセージを持っていて、私はファイルから//を削除した後に消えてしまいました。

関連する問題