Mój kod:
import simplejson as json
s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)
#1
definicja jest zła
#2
definicja jest właściwa
Słyszałem, że w Pythonie ten pojedynczy i podwójny cudzysłów może być wymienny. Czy ktoś może mi to wyjaśnić?
str(dict)
i nie chcęeval
tego. Prosty.replace("'", '"')
powinien załatwić sprawę.json.dumps(..)
dwukrotnie, tak jak w:import json; d = dict(tags=["dog", "cat", "mouse"]); print json.dumps(json.dumps(d))
co daje:"{\"tags\": [\"dog\", \"cat\", \"mouse\"]}"
możesz użyć
ast.literal_eval()
źródło
{ 'a' : 'this "string" really isn\'t!!!!' }
"{'link':'<a href="mylink">http://my.com</a>'}"
? W tym przypadkuast.literal_eval
zgłasza błąd składniMożesz zrzucić JSON z podwójnym cudzysłowem przez:
źródło
demjson to także dobry pakiet do rozwiązania problemu złej składni json:
Stosowanie:
Edytować:
źródło
demjson.decode
jest doskonałym narzędziem do uszkodzonego json - ale w przypadku zadań obejmujących dziesiątki lub setki tysięcy pakietów jsonast.literal_eval
jest znacznie szybsze. Nie znaczydemjson
to , że nie ma swojego miejsca: używam go jako rezerwy na wypadek, gdyby szybsze metody zawiodły.Dwa problemy z udzielonymi dotychczas odpowiedziami, jeśli na przykład jeden z nich przesyła taki niestandardowy JSON. Ponieważ wtedy należałoby zinterpretować przychodzący ciąg znaków (nie słownik Pythona).
Problem 1 -
demjson
: Z Pythonem 3.7. + I przy użyciu Conda nie mogłem zainstalować demjsona, ponieważ oczywiście obecnie nie obsługuje on Pythona> 3.5. Więc potrzebuję rozwiązania z prostszymi środkami, na przykładast
i / lubjson.dumps
.Problem 2 -
ast
&json.dumps
: Jeśli JSON jest zarówno w apostrofach, jak i zawiera ciąg w co najmniej jednej wartości, która z kolei zawiera pojedyncze cudzysłowy, jedynym prostym, ale praktycznym rozwiązaniem, które znalazłem, jest zastosowanie obu:W poniższym przykładzie zakładamy, że
line
jest to przychodzący obiekt ciągu JSON:Krok 1: przekonwertuj przychodzący ciąg znaków na słownik za pomocą
ast.literal_eval()
kroku 2: zastosuj się
json.dumps
do niego, aby zapewnić niezawodną konwersję kluczy i wartości, ale bez dotykania zawartości wartości :json.dumps
sam nie wykonałby zadania, ponieważ nie interpretuje JSON, a widzi tylko ciąg. Podobnieast.literal_eval()
: chociaż poprawnie interpretuje JSON (słownik), nie konwertuje tego, czego potrzebujemy.źródło
Możesz to naprawić w ten sposób:
źródło
Jak powiedziałem, JSON nie jest składnią Pythona. Musisz użyć podwójnych cudzysłowów w JSON. Jego twórca jest (nie) znany z używania ścisłych podzbiorów dopuszczalnej składni, aby złagodzić przeciążenie poznawcze programisty.
Poniżej może się nie powieść, jeśli jeden z ciągów JSON zawiera pojedynczy cudzysłów, jak wskazał @Jiaaro. NIE UŻYWAĆ. Zostawiłem tutaj jako przykład tego, co nie działa.
Jest to bardzo przydatne, aby wiedzieć, że nie istnieją pojedyncze cudzysłowy w ciąg JSON. Powiedzmy, że skopiowałeś i wkleiłeś go z konsoli przeglądarki / cokolwiek. Następnie możesz po prostu wpisać
W przeciwnym razie może się to zepsuć, jeśli użyje również pojedynczych cudzysłowów.
źródło
{"key": "value 'with' single quotes"}
Naprawdę rozwiązał mój problem za pomocą funkcji eval.
źródło
Niedawno natknąłem się na bardzo podobny problem i uważam, że moje rozwiązanie zadziała również dla Ciebie. Miałem plik tekstowy, który zawierał listę pozycji w postaci:
Chciałem przeanalizować powyższe do listy Pythona, ale nie przepadałem za eval (), ponieważ nie mogłem ufać wejściu. Próbowałem najpierw użyć JSON, ale akceptuje tylko elementy w podwójnych cudzysłowach, więc napisałem własny, bardzo prosty lekser dla tego konkretnego przypadku (po prostu podłącz swój własny „stringtoparse”, a otrzymasz jako listę wyników: „items”)
Mam nadzieję, że komuś się to przyda. Cieszyć się!
źródło
Pracuje dla mnie
źródło
Powyższy fragment kodu powinien działać.
źródło