Expecting value: line 1 column 1 (char 0)
Podczas próby dekodowania JSON pojawia się błąd .
Adres URL, którego używam do wywołania interfejsu API, działa dobrze w przeglądarce, ale wyświetla ten błąd po wykonaniu żądania curl. Poniżej znajduje się kod, którego używam do żądania curl.
Błąd występuje o return simplejson.loads(response_json)
response_json = self.web_fetch(url)
response_json = response_json.decode('utf-8')
return json.loads(response_json)
def web_fetch(self, url):
buffer = StringIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, url)
curl.setopt(curl.TIMEOUT, self.timeout)
curl.setopt(curl.WRITEFUNCTION, buffer.write)
curl.perform()
curl.close()
response = buffer.getvalue().strip()
return response
Pełny Traceback:
Traceback:
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/Users/nab/Desktop/pricestore/pricemodels/views.py" in view_category
620. apicall=api.API().search_parts(category_id= str(categoryofpart.api_id), manufacturer = manufacturer, filter = filters, start=(catpage-1)*20, limit=20, sort_by='[["mpn","asc"]]')
File "/Users/nab/Desktop/pricestore/pricemodels/api.py" in search_parts
176. return simplejson.loads(response_json)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/__init__.py" in loads
455. return _default_decoder.decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in decode
374. obj, end = self.raw_decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in raw_decode
393. return self.scan_once(s, idx=_w(s, idx).end())
Exception Type: JSONDecodeError at /pricemodels/2/dir/
Exception Value: Expecting value: line 1 column 1 (char 0)
print repr(response_json)
ci, że jesteś przekazywany.loads()
?simplejson
po co korzystać, skoro można po prostu użyć stdlibjson
(czyli tej samej biblioteki cosimplejson
)?web_fetch()
połączenie nie powiodło się.pycurl
.requests
oferuje znacznie łatwiejszy interfejs API, szczególnie jeśli chodzi o debugowanie tego, co się dzieje. Chyba że musisz mieć nowszą wersjęsimplejson
biblioteki, po prostu trzymaj sięjson
, oszczędzasz zależność do zarządzania.response_json
wartością zwracaną.json()
? Następnie masz już zdekodowane dane i nie musiszjson.loads()
już ich używać .response
rozszyfrowałem to dla ciebie.Odpowiedzi:
Podsumowując rozmowę w komentarzach:
Nie ma potrzeby korzystania z
simplejson
biblioteki, ta sama biblioteka jest dołączona do Pythona jakojson
moduł.Nie ma potrzeby dekodowania odpowiedzi z UTF8 na Unicode, metoda
simplejson
/json
.loads()
może obsługiwać dane zakodowane w UTF8 natywnie.pycurl
ma bardzo archaiczny interfejs API. O ile nie ma określonych wymagań dotyczących korzystania z niego, istnieją lepsze opcje.requests
oferuje najbardziej przyjazny interfejs API, w tym obsługę JSON. Jeśli możesz, zamień swoje połączenie na:źródło
requests
! Ślad wydaje się sugerować, żerequests
używacomplexjson
, który używasimplejson
. Dziwne.simplejson
jeśli są dostępne; niektórzy ludzie wolą korzystać z najnowszej wersji simplejson zamiast z pakietu stdlib w Pythonie.simplejson
używa wbudowanegojson
pod maską, ale daje więcej opisowych błędów. W takim przypadku użyciejson
dałoby po prostu ogólnyValueError: No JSON object could be decoded
.u''
odpowiedź). TwójJSONDecodeError
powie Ci dużo danych został pomyślnie przeanalizowany, zanim wpadł błędu; może to być spowodowane tym, że w tym momencie istnieją nieprawidłowe dane (zniekształcony lub uszkodzony dokument JSON) lub ponieważ dane zostały obcięte.Sprawdź treść danych odpowiedzi, czy rzeczywiste dane są obecne, a zrzut danych wydaje się być dobrze sformatowany.
W większości przypadków
json.loads
-JSONDecodeError: Expecting value: line 1 column 1 (char 0)
błąd jest spowodowany:Ostatecznie błąd mówi ci, że na pierwszej pozycji łańcuch już nie jest zgodny z JSON.
W związku z tym, jeśli parsowanie nie powiedzie się, mimo że ciało danych wygląda JSON jak na pierwszy rzut oka, spróbuj zastąpić cudzysłowy ciała danych:
Uwaga: cytaty w danych muszą być odpowiednio oznaczone znakami ucieczki
źródło
requests.get(url).json()
Just Works JSON również nie jest zniekształcony.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
szczególnie występuje, gdy pusty ciąg jest przekazywany do dekodowania jsonJSONDecodeError: Expecting value: line 1 column 1 (char 0)
dzieje się tak również, gdy pierwszy wiersz w odpowiedzi Json jest nieprawidłowy. Przykładowa odpowiedź z uruchomieniaaz cli
polecenia to["WARNING: The default kind for created storage account will change to 'StorageV2' from 'Storage' in the future", '{',
. To dało mi błąd, który mnie tu doprowadził. Reszta odpowiedzi JEST poprawnym obiektem Json. Tylko ta pierwsza linia coś psuje.Z
requests
libJSONDecodeError
może się zdarzyć, gdy masz kod błędu HTTP, taki jak 404, i spróbuj przeanalizować odpowiedź jako JSON!Najpierw sprawdź 200 (OK) lub pozwól, aby podniósł się w przypadku błędu, aby uniknąć tego przypadku. Żałuję, że nie powiodło się z mniej tajemniczym komunikatem błędu.
UWAGA : jak podał Martijn Pieters w komentarzach, serwery mogą odpowiadać za pomocą JSON w przypadku błędów (zależy to od implementacji), więc sprawdzanie
Content-Type
nagłówka jest bardziej niezawodne.źródło
Myślę, że to warto wspomnieć, że w przypadkach, gdy jesteś parsowania zawartość samego pliku JSON - testy sprawdzające mogą być przydatne w celu zapewnienia, że jesteś rzeczywiście powołując się
json.loads()
na zawartości pliku, w przeciwieństwie do ścieżki pliku tego JSON :Jestem trochę zawstydzony przyznając, że czasem może się to zdarzyć:
źródło
json.load()
zamiast tego.Sprawdź format kodowania pliku i użyj odpowiedniego formatu kodowania podczas czytania pliku. Rozwiąże twój problem.
źródło
encoding='utf-8'
, więc przypuszczam, że czasami trzeba wypróbować kilka rzeczy.Często dzieje się tak, ponieważ ciąg, który próbujesz przeanalizować, jest pusty:
Możesz temu zaradzić, sprawdzając, czy
json_string
jest wcześniej pusty:źródło
response.read()
a potem byłem przerażony, gdy wywołało to inne wywołanieExpecting value: line 1
itp. Usunąłem instrukcję debugowania i problem został rozwiązany.Mogą być osadzone zera, nawet po wywołaniu decode (). Użyj replace ():
źródło
Miałem dokładnie ten problem przy użyciu żądań. Dzięki Christophe Roussy za jego wyjaśnienie.
Do debugowania użyłem:
Otrzymałem odpowiedź 404 z API.
źródło
response.status_code
lubprint(response.status_code)
.Miałem ten sam problem z żądaniami (biblioteka python). To się stało
accept-encoding
nagłówek.Ustawiono to w następujący sposób:
'accept-encoding': 'gzip, deflate, br'
Po prostu usunąłem go z żądania i przestałem otrzymywać błąd.
źródło
Dla mnie nie używał uwierzytelnienia w żądaniu.
źródło
Dla mnie serwer odpowiadał czymś innym niż 200 i odpowiedź nie była sformatowana w formacie json. Skończyło się na tym przed analizą JSON:
źródło
Jeśli jesteś użytkownikiem systemu Windows, interfejs API Tweepy może wygenerować pustą linię między obiektami danych. Z powodu tej sytuacji może pojawić się błąd „JSONDecodeError: Oczekiwanie na wartość: wiersz 1 kolumna 1 (znak 0)”. Aby uniknąć tego błędu, możesz usunąć puste linie.
Na przykład:
Odwołanie: API strumienia Twittera podaje JSONDecodeError („Oczekiwana wartość”, s, err.value) z None
źródło
Po prostu sprawdź, czy żądanie ma kod stanu 200. Na przykład:
źródło
Wystąpił taki błąd w odpowiedzi internetowego interfejsu API opartego na języku Python
.text
, ale doprowadził mnie tutaj, więc może to pomóc innym z podobnym problemem (bardzo trudno jest odfiltrować odpowiedzi i zażądać problemów podczas wyszukiwania przy użyciurequests
..)Użycie
json.dumps()
na argrze żądaniadata
do utworzenia poprawnie zakończonego ciągu JSON przed testem POST naprawiło problemźródło