2015-01-29 8 views
14

Wyodrębniam tabelę postgres jako json. Plik wyjściowy zawiera linie jak:Python json.loads ValueError, oczekując separatora

{"data": {"test": 1, "hello": "I have \" !"}, "id": 4} 

Teraz trzeba załadować je w moim kodu Pythona z wykorzystaniem json.loads, ale pojawia się ten błąd:

Traceback (most recent call last): 
    File "test.py", line 33, in <module> 
    print json.loads('''{"id": 4, "data": {"test": 1, "hello": "I have \" !"}}''') 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 381, in raw_decode 
    obj, end = self.scan_once(s, idx) 
ValueError: Expecting , delimiter: line 1 column 50 (char 49) 

zorientowali się poprawka jest dodanie kolejnego \ do \". Tak więc, jeśli mijam

{"data": {"test": 1, "hello": "I have \\" !"}, "id": 4} 

do json.loads, otrzymuję to:

{u'data': {u'test': 1, u'hello': u'I have " !'}, u'id': 4} 

Czy istnieje sposób to zrobić bez dodawania dodatkowych \? Jak przekazanie parametru do json.loads czy coś takiego?

+1

Hej ludzie, mam ten sam problem jakikolwiek ważny solutuion? –

Odpowiedz

4

Spróbuj tego:

json.loads(r'{"data": {"test": 1, "hello": "I have \" !"}, "id": 4}') 

Jeśli masz ten ciąg wewnątrz zmiennej, a potem po prostu:

json.loads(data.replace("\\", r"\\")) 

Nadzieję, że to pomaga!

+1

Obawiam się, że to nie działa, "{" dane ": {" test ": 1," cześć ":" Mam \ "!"}, "Id": 4} ''i'' { "data": {"test": 1, "cześć": "Mam \"! "}," id ": 4} '. replace (" \\ ", r" \\ ")' są dokładnie takie same . – AliBZ

+0

@AliBZ To nie działa, ponieważ brakuje ci 'r' przed ciągiem. Skopiuj i wklej mój pierwszy przykład, który zadziała. – cdonts

+0

Mam ciąg wewnątrz zmiennej, dlatego użyłem twojego drugiego przykładu. – AliBZ

15

Można określ tak zwane „surowe ciągi”:

>>> print r'{"data": {"test": 1, "hello": "I have \" !"}, "id": 4}' 
{"data": {"test": 1, "hello": "I have \" !"}, "id": 4} 

Nie zinterpretować backslashy.

Zwykłe struny zmienić \" do ", więc można mieć " znaków w ciągi, które same są ograniczone przez cudzysłów:

>>> "foo\"bar" 
'foo"bar' 

więc transformacja od \" do " nie jest wykonywana przez json.loads, ale Python samo.

+0

Czytam plik danych wiersz po linii. Więc mam słowniki w zmiennych. Próbowałem '.replace (" \\ ", r" \\ ")' i '.encode ('string-escape')', nie działa. – AliBZ

+0

W JSON '' \ "" '' '' '' również, podobnie jak w Pythonie. Jeśli w pliku wejściowym znajduje się '\", w rzeczywistości jest to '' '. Jeśli z jakiegoś powodu chcesz mieć 'r '\"', musisz mieć '.replace ('' ',' \\" ') '. – Gandaro

0

Wypróbuj sposoby source.replace('""', '') lub pod nią, ponieważ "" w źródle sprawi, że json.loads(source) nie będzie mógł ich rozróżnić.

Powiązane problemy