Estou recebendo erro Expecting value: line 1 column 1 (char 0)
ao tentar decodificar JSON.
O URL que eu uso para a chamada da API funciona bem no navegador, mas fornece esse erro quando feito por meio de uma solicitação de curl. A seguir está o código que eu uso para a solicitação de ondulação.
O erro acontece em 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
Traceback completo:
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)
diz a você que está sendo passado.loads()
?simplejson
quando você pode simplesmente usar o stdlibjson
(que é a mesma biblioteca quesimplejson
)?web_fetch()
chamada falhou.pycurl
.requests
oferece uma API muito mais fácil, especialmente quando se trata de depurar o que está acontecendo. A menos que você precise especificamente de uma versão mais recente dasimplejson
biblioteca, fiquejson
atento, economizando uma dependência para gerenciar.response_json
o valor de retorno de.json()
? Então você já decodificou os dados e não precisajson.loads()
mais usá- los.response
decodificado para você.Respostas:
Para resumir a conversa nos comentários:
Não há necessidade de usar
simplejson
biblioteca, a mesma biblioteca está incluída no Python como ojson
módulo.Não há necessidade de decodificar uma resposta de UTF8 para unicode, o
simplejson
json
.loads()
método / pode manipular dados codificados em UTF8 nativamente.pycurl
tem uma API muito arcaica. A menos que você tenha um requisito específico para usá-lo, existem melhores opções.requests
oferece a API mais amigável, incluindo suporte a JSON. Se puder, substitua sua chamada por:fonte
requests
! O traço parece sugerir querequests
usoscomplexjson
, quais usossimplejson
. Esquisito.simplejson
se disponíveis; algumas pessoas desejam usar a versão mais recente do simplejson, em vez da que acompanha o stdlib do Python.simplejson
usa o built-injson
sob o capô, mas fornece mais erros descritivos. Nesse caso, usarjson
apenas daria a você um genéricoValueError: No JSON object could be decoded
.u''
). VocêJSONDecodeError
informa que muitos dados foram analisados com sucesso antes de ocorrerem um erro; isso pode ocorrer porque há dados inválidos nesse ponto (documento JSON malformado ou corrompido) ou porque os dados foram truncados.Verifique o corpo de dados da resposta, se há dados reais e se um despejo de dados parece estar bem formatado.
Na maioria dos casos o seu
json.loads
-JSONDecodeError: Expecting value: line 1 column 1 (char 0)
erro é devido a:Por fim, o erro informa que, na primeira posição, a sequência já não está em conformidade com o JSON.
Como tal, se a análise falhar, apesar de ter um corpo de dados semelhante ao JSON à primeira vista, tente substituir as aspas do corpo de dados:
Nota: As cotações nos dados devem ser escapadas corretamente
fonte
requests.get(url).json()
Just Works, o JSON também não está mal formado.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
ocorre especificamente quando uma seqüência vazia é passada para decodificação de jsonJSONDecodeError: Expecting value: line 1 column 1 (char 0)
também acontece quando a primeira linha na resposta json é inválida. Exemplo resposta a execução de umaz cli
comando é["WARNING: The default kind for created storage account will change to 'StorageV2' from 'Storage' in the future", '{',
. Isso me deu o erro que me levou até aqui. O restante da resposta É um objeto json válido. Apenas essa primeira linha quebra as coisas.Com a
requests
libJSONDecodeError
isso pode ocorrer quando você tem um código de erro http como 404 e tenta analisar a resposta como JSON!Você deve primeiro verificar se há 200 (OK) ou deixar que isso aconteça com erro para evitar esse caso. Desejo que tenha falhado com uma mensagem de erro menos enigmática.
NOTA : como Martijn Pieters afirmou nos comentários, os servidores podem responder com JSON em caso de erros (depende da implementação), portanto, verificar o
Content-Type
cabeçalho é mais confiável.fonte
Acho que vale a pena mencionar que, nos casos em que você está analisando o conteúdo de um arquivo JSON - as verificações de sanidade podem ser úteis para garantir que você esteja realmente invocando
json.loads()
o conteúdo do arquivo, em oposição ao caminho do arquivo JSON :Estou um pouco envergonhado em admitir que isso pode acontecer às vezes:
fonte
json.load()
lugar.Verifique o formato de codificação do seu arquivo e use o formato de codificação correspondente ao ler o arquivo. Isso resolverá o seu problema.
fonte
encoding='utf-8'
, então suponho que às vezes você precise experimentar algumas coisas.Muitas vezes, isso ocorre porque a string que você está tentando analisar está em branco:
Você pode remediar verificando se
json_string
está vazio de antemão:fonte
response.read()
e, em seguida, fiquei consternado quando outra chamada resultou emExpecting value: line 1
etc. Removida a instrução de depuração e o problema resolvido.Pode haver 0s incorporados, mesmo depois de chamar decode (). Use replace ():
fonte
Eu tive exatamente esse problema usando solicitações. Agradeço a Christophe Roussy por sua explicação.
Para depurar, usei:
Eu estava recebendo uma resposta 404 de volta da API.
fonte
response.status_code
ouprint(response.status_code)
.Eu estava tendo o mesmo problema com solicitações (a biblioteca python). Por acaso era o
accept-encoding
cabeçalho.Foi definido desta maneira:
'accept-encoding': 'gzip, deflate, br'
Eu simplesmente o removi da solicitação e parei de receber o erro.
fonte
Para mim, não estava usando autenticação na solicitação.
fonte
Para mim, foi o servidor respondendo com algo diferente de 200 e a resposta não foi formatada em json. Acabei fazendo isso antes da análise do json:
fonte
Se você é usuário do Windows, a Tweepy API pode gerar uma linha vazia entre objetos de dados. Devido a essa situação, você pode obter o erro "JSONDecodeError: Expecting value: line 1 column 1 (char 0)". Para evitar esse erro, você pode excluir linhas vazias.
Por exemplo:
Referência: a API de fluxo do Twitter fornece JSONDecodeError ("Expecting value", s, err.value) de None
fonte
Basta verificar se a solicitação possui um código de status 200. Por exemplo:
fonte
Eu recebi esse erro na resposta de uma API da Web baseada em Python
.text
, mas ela me levou aqui, então isso pode ajudar outras pessoas com um problema semelhante (é muito difícil filtrar respostas e solicitar problemas em uma pesquisa ao usarrequests
..)Usando
json.dumps()
o arg de solicitaçãodata
para criar uma string de JSON com escape correto antes do POSTing corrigir o problema para mimfonte
Eu encontrei o mesmo problema, enquanto imprimia a string json aberta em um arquivo json, descobri que a string json começa com 'ï »¿', que, ao realizar algumas pesquisas, o arquivo é decodificado por padrão com UTF-8 e alterando a codificação para utf-8-sig, a marcação é removida e carrega o json sem problemas:
fonte