回答:
str(dict)
であり、eval
それを望んでいません。単純な方法.replace("'", '"')
でうまくいくはずです。
json.dumps(..)
のように二回:import json; d = dict(tags=["dog", "cat", "mouse"]); print json.dumps(json.dumps(d))
与える:"{\"tags\": [\"dog\", \"cat\", \"mouse\"]}"
あなたは使うことができます ast.literal_eval()
>>> import ast
>>> s = "{'username':'dfdsfdsf'}"
>>> ast.literal_eval(s)
{'username': 'dfdsfdsf'}
{ 'a' : 'this "string" really isn\'t!!!!' }
"{'link':'<a href="mylink">http://my.com</a>'}"
ますか?この場合、ast.literal_eval
構文エラーをスローします
JSONを二重引用符でダンプするには、次のようにします。
import json
# mixing single and double quotes
data = {'jsonKey': 'jsonValue',"title": "hello world"}
# get string with all double quotes
json_string = json.dumps(data)
demjsonは、json構文の問題を解決するための優れたパッケージでもあります。
pip install demjson
使用法:
from demjson import decode
bad_json = "{'username':'dfdsfdsf'}"
python_dict = decode(bad_json)
編集:
demjson.decode
損傷したjsonには優れたツールですが、大量のjsonデータを処理する場合ast.literal_eval
は、より適切に一致し、はるかに高速になります。
demjson.decode
損傷したjsonには優れたツールですが、数万または数十万のjsonパケットを含むタスクの場合ast.literal_eval
は、はるかに高速です。言うまでもありdemjson
ませんが、高速なメソッドが失敗した場合のフォールバックとして使用します。
たとえば、1つがそのような非標準のJSONをストリーミングする場合、これまでに与えられた回答に関する2つの問題。それは、(Python辞書ではなく)入力文字列を解釈する必要があるためです。
問題1- demjson
:Python 3.7。+でcondaを使用すると、現在のところpython> 3.5をサポートしていないため、demjsonをインストールできませんでした。したがって、たとえばast
、および/またはより簡単な手段を備えたソリューションが必要json.dumps
です。
問題2- ast
&json.dumps
:JSONが両方とも単一引用符で囲まれ、少なくとも1つの値に文字列が含まれ、次に単一引用符が含まれる場合、私が見つけた唯一のシンプルで実用的な解決策は両方を適用することです。
次の例でline
は、着信JSON文字列オブジェクトを想定しています。
>>> line = str({'abc':'008565','name':'xyz','description':'can control TV\'s and more'})
ステップ1:ast.literal_eval()
ステップ2 を使用して着信文字列を辞書にjson.dumps
変換します:キーと値の信頼できる変換のためにそれに適用しますが、値の内容には触れません:
>>> import ast
>>> import json
>>> print(json.dumps(ast.literal_eval(line)))
{"abc": "008565", "name": "xyz", "description": "can control TV's and more"}
json.dumps
JSONを解釈せず、文字列のみを表示するため、単独では機能しません。同様にast.literal_eval()
:JSON(辞書)を正しく解釈しますが、必要なものは変換しません。
あなたはそれをそのように修正することができます:
s = "{'username':'dfdsfdsf'}"
j = eval(s)
前述のとおり、JSONはPythonの構文ではありません。JSONでは二重引用符を使用する必要があります。その作成者は、プログラマーの認知過負荷を緩和するために、許可された構文の厳密なサブセットを使用することで(非)有名です。
@Jiaaroによって指摘されたように、JSON文字列の1つ自体に単一引用符が含まれている場合、以下が失敗する可能性があります。使ってはいけません。機能しない例としてここに残しました。
JSON文字列に単一引用符がないことを知っていることは本当に役に立ちます。たとえば、ブラウザコンソールなどからコピーして貼り付けたとします。次に、単に入力することができます
a = json.loads('very_long_json_string_pasted_here')
単一引用符も使用している場合は、これが壊れる可能性があります。
{"key": "value 'with' single quotes"}
eval関数を使用して問題を本当に解決しました。
single_quoted_dict_in_string = "{'key':'value', 'key2': 'value2'}"
desired_double_quoted_dict = eval(single_quoted_dict_in_string)
# Go ahead, now you can convert it into json easily
print(desired_double_quoted_dict)
私は最近、非常に類似した問題に直面しました。私の解決策もあなたのために機能すると信じています。次の形式の項目のリストを含むテキストファイルがありました。
["first item", 'the "Second" item', "thi'rd", 'some \\"hellish\\" \'quoted" item']
上記をpythonリストに解析したかったのですが、入力を信頼できなかったため、eval()には熱心ではありませんでした。最初にJSONを使用してみましたが、二重引用符で囲まれたアイテムしか受け入れないため、この特定のケース用に独自の非常にシンプルなレクサーを作成しました(独自の「stringtoparse」をプラグインするだけで、出力リストとして表示されます: 'items')
#This lexer takes a JSON-like 'array' string and converts single-quoted array items into escaped double-quoted items,
#then puts the 'array' into a python list
#Issues such as ["item 1", '","item 2 including those double quotes":"', "item 3"] are resolved with this lexer
items = [] #List of lexed items
item = "" #Current item container
dq = True #Double-quotes active (False->single quotes active)
bs = 0 #backslash counter
in_item = False #True if currently lexing an item within the quotes (False if outside the quotes; ie comma and whitespace)
for c in stringtoparse[1:-1]: #Assuming encasement by brackets
if c=="\\": #if there are backslashes, count them! Odd numbers escape the quotes...
bs = bs + 1
continue
if (dq and c=='"') or (not dq and c=="'"): #quote matched at start/end of an item
if bs & 1==1: #if escaped quote, ignore as it must be part of the item
continue
else: #not escaped quote - toggle in_item
in_item = not in_item
if item!="": #if item not empty, we must be at the end
items += [item] #so add it to the list of items
item = "" #and reset for the next item
continue
if not in_item: #toggle of single/double quotes to enclose items
if dq and c=="'":
dq = False
in_item = True
elif not dq and c=='"':
dq = True
in_item = True
continue
if in_item: #character is part of an item, append it to the item
if not dq and c=='"': #if we are using single quotes
item += bs * "\\" + "\"" #escape double quotes for JSON
else:
item += bs * "\\" + c
bs = 0
continue
うまくいけば、それは誰かにとって有用です。楽しい!
import ast
answer = subprocess.check_output(PYTHON_ + command, shell=True).strip()
print(ast.literal_eval(answer.decode(UTF_)))
私のために働く