JSON ValueError:予期されるプロパティ名:行1列2(文字1)


97

json.loadsを使用してdictオブジェクトに変換する際に問題が発生し、私が間違っていることを理解できません。これを実行すると、正確なエラーは

ValueError: Expecting property name: line 1 column 2 (char 1)

これが私のコードです:

from kafka.client import KafkaClient
from kafka.consumer import SimpleConsumer
from kafka.producer import SimpleProducer, KeyedProducer
import pymongo
from pymongo import MongoClient
import json

c = MongoClient("54.210.157.57")
db = c.test_database3
collection = db.tweet_col

kafka = KafkaClient("54.210.157.57:9092")

consumer = SimpleConsumer(kafka,"myconsumer","test")
for tweet in consumer:
    print tweet.message.value
    jsonTweet=json.loads(({u'favorited': False, u'contributors': None})
    collection.insert(jsonTweet)

エラーは2行目から最後の行で発生していると確信しています

jsonTweet=json.loads({u'favorited': False, u'contributors': None})

しかし、私はそれを修正するために何をすべきかわかりません。何かアドバイスをいただければ幸いです。


3
そこに構文エラーがありますか?迷子"はコピー貼り付けエラーですか?
karthikr 2014

行で出力されたJSON文字列は何でしたprint tweet.message.valueか?
ルークウッドワード

1
これValueErrorは、コードの問題ではなく、JSON入力のエラーが原因で送信されます。("通常は送信する必要がある行方不明者の横にあるSyntaxErrorので、それは単なるコピーペーストエラーだと思います。)
Cld

(ちなみに、utf_8はjson.loadsのデフォルトのエンコーディングなので、指定する必要はありません。)
Cld

入力いただきありがとうございます。質問を編集しました。今はもっと明確になっているはずです。
dredbound

回答:


83

json.loadsjson文字列をpython dictにロードし、pythonをjson文字列にjson.dumpsダンプしdictます。次に例を示します。

>>> json_string = '{"favorited": false, "contributors": null}'
'{"favorited": false, "contributors": null}'
>>> value = json.loads(json_string)
{u'favorited': False, u'contributors': None}
>>> json_dump = json.dumps(value)
'{"favorited": false, "contributors": null}'

だから、その行は、あなたがしようとしているので、間違っているloadのpython dict、かつjson.loads有効な期待されjson stringている必要がありどれを<type 'str'>

したがって、jsonをロードしようとしている場合は、ロードする内容をjson_string上記のように変更するか、ダンプする必要があります。これは、与えられた情報からの私の最良の推測です。あなたが達成しようとしていることは何ですか?

またu、@ Cldがコメントで述べたように、文字列の前にを指定する必要はありません。


2
<> JSONオブジェクト- - json.loadsがロードされますPythonの辞書に -あなたは、文字列、いないの負荷()を使用している-ドキュメントは独自のコードが何でも言って何に反していることJSONをオブジェクト
2018年

はい、@ 7stud、正解です。文字列をロードしています。しかし、それは有効なjson文字列でなければなりません。回答を更新しました。
Yep_It's_Me 2018年

186

同じエラーを返す別の問題が発生しました。

単一引用問題

私は一重引用符で json文字列を使用しました:

{
    'property': 1
}

ただしjson.loads、jsonプロパティには二重引用符のみを受け入れます

{
    "property": 1
}

最後のカンマ問題

json.loads 最後のコンマを受け入れません:

{
  "property": "text", 
  "property2": "text2",
}

解決策:ast単一引用符と最後のカンマの問題を解決する

この処理にはast(Python 2と3の両方の標準ライブラリの一部)を使用できます。次に例を示します。

import ast
# ast.literal_eval() return a dict object, we must use json.dumps to get JSON string
import json

# Single quote to double with ast.literal_eval()
json_data = "{'property': 'text'}"
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property": "text"}

# ast.literal_eval() with double quotes
json_data = '{"property": "text"}'
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property": "text"}

# ast.literal_eval() with final coma
json_data = "{'property': 'text', 'property2': 'text2',}"
json_data = ast.literal_eval(json_data)
print(json.dumps(json_data))
# Displays : {"property2": "text2", "property": "text"}

を使用astすると、Python辞書のようにJSONを調べることにより、単一引用符や最後のカンマの問題を防ぐことができます(そのため、Python辞書構文に従う必要があります)。これはeval()、リテラル構造の機能のかなり安全な代替手段です。

Pythonのドキュメントでは、大規模で複雑な文字列を使用するよう警告されています。

警告PythonのASTコンパイラのスタック深度の制限により、Pythonインタープリタが十分に大きく複雑な文字列でクラッシュする可能性があります。

単一引用符付きのjson.dumps

使用するにはjson.dumps、単一引用符で簡単に、あなたは、このコードを使用することができます:

import ast
import json

data = json.dumps(ast.literal_eval(json_data_single_quote))

ast ドキュメンテーション

ast Python 3ドキュメント

ast Python 2ドキュメント

ツール

JSONを頻繁に編集する場合は、CodeBeautifyを使用できます。構文エラーを修正し、JSONを縮小/美化するのに役立ちます。

お役に立てば幸いです。


10
  1. すべての単一引用符を二重引用符で置き換える
  2. 'u' 'を文字列から' "'に置き換えます...したがって、基本的には、文字列をjsonにロードする前に内部ユニコードを文字列に変換します
>> strs = "{u'key':u'val'}"
>> strs = strs.replace("'",'"')
>> json.loads(strs.replace('u"','"'))

1
もっとpythonicな方法はast.literal_eval( "{u'key ':u'val'}")を使うことでしょう。フォーマットに関連するすべての問題に対応します
Vinay Pande

json.loads(strs.replace( 'u "'、 ''))が機能していません。以下のエラー、トレースバック(最後の最新呼び出し)があります:ファイル" <stdin> "、行1、<モジュール>ファイル"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py"、line 338、in lines return _default_decoder.decode(s)obj、end = self.scan_once(s 、idx)ValueError:Expected property name:line 1 column 2(char 1)
Sanjay Pradeep

4

他のすべての答えはあなたのクエリに答えるかもしれませんが、私は次の,ように私のjson文字列の最後に追加した迷子のために同じ問題に直面しました:

{
 "key":"123sdf",
 "bus_number":"asd234sdf",
}

,このように余分なものを取り除いたとき、私はついにそれを機能させました:

{
 "key":"123sdf",
 "bus_number":"asd234sdf"
}

この助けを願っています!乾杯。



@fedorquiその部分は私の答えの後に追加されました(stackoverflow.com/posts/36599122/revisions)今、あなたは+1をしたいかもしれません:)
Rishabh Agrahari

1
ああ、あなたは正しいです!2018年1月に追加されました。謝罪して+1 :)
fedorqui 'SO stop harming'

0

使用済み、例

In [15]: a = "[{'start_city': '1', 'end_city': 'aaa', 'number': 1},\
...:      {'start_city': '2', 'end_city': 'bbb', 'number': 1},\
...:      {'start_city': '3', 'end_city': 'ccc', 'number': 1}]"
In [16]: import ast
In [17]: ast.literal_eval(a)
Out[17]:
[{'end_city': 'aaa', 'number': 1, 'start_city': '1'},
 {'end_city': 'bbb', 'number': 1, 'start_city': '2'},
 {'end_city': 'ccc', 'number': 1, 'start_city': '3'}]

0

これに遭遇した別のケースはecho、JSONをpythonスクリプトにパイプするために使用していて、JSON文字列を不注意に二重引用符で囲んだ場合です。

echo "{"thumbnailWidth": 640}" | myscript.py

JSON文字列自体に引用符が付いていることに注意してください。

echo '{"thumbnailWidth": 640}' | myscript.py

さて、これはpythonスクリプトが受け取ったものです{thumbnailWidth: 640}。二重引用符は効果的に取り除かれました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.