2010-11-12 7 views
62

Мой код:Одиночные против двойные кавычки в JSON

import simplejson as json 

s = "{'username':'dfdsfdsf'}" #1 
#s = '{"username":"dfdsfdsf"}' #2 
j = json.loads(s) 

#1 определение неправильное определение

#2 прав

Я слышал, что в Python, что однократное двойные кавычки могут быть взаимозаменяемыми, может кто-нибудь объясняет это мне?

ответ

105

JSON syntax не является синтаксисом Python. JSON требует двойных кавычек для своих строк.

+2

, но сначала это одна цитата в JSON, я смущен. Это можно передать, но второй не может. –

+3

# 1 не загружается здесь. –

+0

о, да, извините, спасибо. –

23

Вы можете сбросить JSON с двойной цитатой:

from json import dumps 

#mixing single and double quotes 
data = {'jsonKey': 'jsonValue',"title": "hello world"} 

jsonString = json.dumps(data) 
#get string with all double quotes 
+4

все идет не так, вы сериализуете структуры данных python в JSON; Оригинальный вопрос касается десериализации JSON для структур данных python. – tedder42

+2

Идея состоит в том, чтобы сериализовать python в json с помощью json.dumps, а затем вызвать json.loads на нем, когда он находится в форме str. – jheld

+2

Вы не понимаете здесь. Если вы хотите загрузить строку json, это должна быть двойная кавычка. То, что вы делаете, все равно дамп json, а не json string. – LegitMe

61

вы можете использовать ast.literal_eval()

>>> import ast 
>>> s = "{'username':'dfdsfdsf'}" 
>>> ast.literal_eval(s) 
{'username': 'dfdsfdsf'} 
+2

Это была отличная помощь. Большое спасибо. :) –

+1

Мне нравится этот ответ наилучший: у вас не всегда есть выбор: если кто-то дает вам одинарные кавычки, вы получаете одинарные кавычки. Для json.loads нужен дополнительный аргумент, или вы должны использовать это. Глобальная замена «» - это катастрофа, так как, если входящие данные: '{'a': 'this' string" really isn \ 't !!!!' } ' –

5

demjson также хороший пакет, чтобы решить проблему плохого синтаксиса JSON:

pip install demjson 

Использование:

from demjson import decode 
bad_json = "{'username':'dfdsfdsf'}" 
python_dict = decode(bad_json) 

Edit:

demjson.decode является отличным инструментом для поврежденных JSON, но, когда вы имеете дело с большим amourt данных JSon ast.literal_eval лучше подходит и гораздо быстрее.

+3

' demjson.decode' - отличный инструмент для поврежденного json, но для задач, связанных с десятками или сотнями тысяч json-пакетов, 'ast.literal_eval' работает намного быстрее. Не сказать, что 'demjson' не имеет своего места: я использую его как резерв в случае, если более быстрые методы терпят неудачу. – mjwunderlich

+1

Огромное вам спасибо, я не знал об этом. – DhiaTN

-1
import json 
data = json.dumps(list) 
print(data) 

выше фрагмент кода должен работать.

+1

Это может сделать что-то полезное, но оно не отвечает на заданный вопрос. Проблема начинается с строки, а не из списка. – Rachel

0

Как сказано, JSON не является синтаксисом Python. Вам нужно использовать двойные кавычки в JSON. Его создатель (in) известен тем, что использует строгие подмножества допустимого синтаксиса для облегчения когнитивной перегрузки программиста.

Это действительно полезно, чтобы знать, что в строке JSON нет одиночных кавычек. Скажем, вы скопировали и вставили его с консоли браузера/независимо. Затем вы можете просто ввести

a = json.loads('very_long_json_string_pasted_here') 

Это может быть иначе нарушено, если оно будет использоваться для одиночных кавычек.

Смежные вопросы