Hata: Beklenen değer: satır 1 sütun 1 (karakter 0)


261

Expecting value: line 1 column 1 (char 0)JSON kodunu çözmeye çalışırken hata alıyorum .

API çağrısı için kullandığım URL tarayıcıda iyi çalışıyor, ancak bir kıvrılma isteği yoluyla yapıldığında bu hatayı veriyor. Kıvrılma isteği için kullandığım kod aşağıdadır.

Hata şu konumda olur: 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

Tam Geri İzleme:

Geri iz:

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)

2
Son fakat en az değil, print repr(response_json)size geçildiğini söyleyen .loads()nedir?
Martijn Pieters

4
Bir tane daha: neden simplejsonstdlib'i json( aynı kütüphane ile aynısimplejson olan) kullanabileceğiniz zaman kullanalım ?
Martijn Pieters

3
Bu boş bir dize. Kişisel web_fetch() çağrısı başarısız oldu.
Martijn Pieters

1
Evet, kullanmaktan daha kolay bir şey kullanmanızı öneririm pycurl. requestsözellikle neler olup bittiğini ayıklamak söz konusu olduğunda çok daha kolay bir API sunar. Özellikle kütüphanenin daha yeni bir sürümüne sahip olmanız gerekmedikçe simplejson, sadece sadık jsonkalın, yönetme bağımlılığından tasarruf etmenizi sağlar.
Martijn Pieters

1
olduğu response_jsondönüş değeri .json()? O zaman zaten kodu çözülmüş verileriniz var ve json.loads()artık kullanmanıza gerek yok. responsesizin için çözdüm.
Martijn Pieters

Yanıtlar:


125

Konuşmada yorumlarda özetlemek için:

  • simplejsonKütüphane kullanılmasına gerek yoktur , jsonmodül ile aynı kütüphane Python'a dahildir .

  • UTF8'den unicode'a bir yanıtın kodunun çözülmesine gerek yoktur, simplejson/ json .loads()yöntemi UTF8 kodlu verileri yerel olarak işleyebilir.

  • pycurlçok eski bir API'ye sahip. Kullanmak için özel bir gereksiniminiz yoksa, daha iyi seçenekler vardır.

requestsJSON desteği dahil en kolay API'yı sunar. Yapabiliyorsanız, aramanızı şu şekilde değiştirin:

import requests

return requests.get(url).json()

93
Aynı hatayı kullanarak alıyorum requests! İz önermek görünüyor requestskullanımlarını complexjsonhangi kullanımları simplejson. Tuhaf.
rayu

@Rayu: istekleri kullanacaksimplejson varsa; bazı insanlar Python stdlib ile birlikte sunulanlar yerine en yeni simplejson sürümünü kullanmak isterler.
Martijn Pieters

5
"Simplejson kütüphanesini kullanmaya gerek yok, aynı kütüphane Python ile json modülü olarak dahil edilmiş." ... Saygılarımla katılmıyorum. kaputun altında simplejsonyerleşik jsonolanı kullanır, ancak daha açıklayıcı hatalar verir. Bu durumda kullanmak jsonsize sadece bir jenerik verecektir ValueError: No JSON object could be decoded.
BoltzmannBrain

2
Bunun nedeni bir iptal veya eksik json olabilir mi? Bunu arada bir rastgele alıyorum, nasıl çoğaltılacağından emin değilim.
Christophe Roussy

2
@ChristopheRoussy: evet, bu sorunun asıl noktası (OP'nin boş bir u'' yanıtı var). Sizin JSONDecodeErrorbir hata ile karşılaştım önce kadar veri başarıyla ayrıştırıldı söyler; bunun nedeni, o noktada geçersiz veriler (hatalı biçimlendirilmiş veya bozuk JSON belgesi) olması veya verilerin kesilmiş olması olabilir.
Martijn Pieters

64

Yanıt veri gövdesini, gerçek verilerin mevcut olup olmadığını ve veri dökümünün iyi biçimlendirilmiş gibi görünüp görünmediğini kontrol edin.

Çoğu durumda json.loads- JSONDecodeError: Expecting value: line 1 column 1 (char 0)hatanızın nedeni:

  • JSON'a uygun olmayan fiyat teklifi
  • XML / HTML çıktısı (<ile başlayan bir dize) veya
  • uyumsuz karakter kodlaması

Sonuçta hata, ilk konumda dizenin zaten JSON ile uyumlu olmadığını söyler.

Bu nedenle, JSON'a ilk bakışta benzeyen bir veri gövdesine sahip olmasına rağmen ayrıştırma başarısız olursa , veri gövdesinin alıntılarını değiştirmeyi deneyin:

import sys, json
struct = {}
try:
  try: #try parsing to dict
    dataform = str(response_json).strip("'<>() ").replace('\'', '\"')
    struct = json.loads(dataform)
  except:
    print repr(resonse_json)
    print sys.exc_info()

Not: Verilerdeki tırnak işaretleri düzgün bir şekilde kaçmalıdır


4
Yorumlarda OP'nin boş bir yanıt aldığı açıktı. requests.get(url).json()Just Works'ten beri JSON da yanlış biçimlendirilmemiş.
Martijn Pieters

JSONDecodeError: Expecting value: line 1 column 1 (char 0)özellikle boş bir dize json kod çözme geçirildiğinde oluşur
wesinat0r

JSONDecodeError: Expecting value: line 1 column 1 (char 0)json yanıtındaki ilk satır geçersiz olduğunda da olur. Bir az clikomutun çalıştırılmasından örnek yanıt ["WARNING: The default kind for created storage account will change to 'StorageV2' from 'Storage' in the future", '{',. Bu beni buraya getiren hata verdi. Yanıtın geri kalanı geçerli bir json nesnesidir. Sadece ilk satır bir şeyleri kırar.
SeaDude

35

İle requestslib JSONDecodeErrorEğer 404 gibi bir http hata kodu ve JSON olarak tepkisini ayrıştırmak çalıştığınızda olabilir!

Bu durumdan kaçınmak için önce 200'ü (Tamam) kontrol etmeniz veya hatayla yükselmesine izin vermeniz gerekir. Keşke daha az şifreli bir hata mesajı ile başarısız olsaydı.

NOT : Yorumlarda belirtildiği gibi Martijn Pieters sunucuları hata durumunda JSON ile yanıt verebilir (uygulamaya bağlıdır), bu nedenle Content-Typeüstbilgiyi kontrol etmek daha güvenilirdir.


Eski yorum için özür dilerim, ancak bir örneğe bağlantı verebilir misiniz? Becerileri "eylemi gerçekleştir" den almaya çalışıyorum.
dcclassics

@dcclassics: Örnek: sunucu tarafında başarısız oluyor ve sunucu JSON ile yanıtlamak yerine bir hata sayfası (HTML) göstererek yanıt veriyor.
Christophe Roussy

1
Sunucular JSON gövdelerini hata yanıtlarına dahil edebilir ve yapabilir. Sadece 200 OK yanıtı değil. İçerik Türü başlığını kontrol etmek istiyorsunuz.
Martijn Pieters

29

Aklı çekleri aslında yürütmesini emin olmak için yararlı olabilir - onun 'için değer bir JSON dosyasının kendisini içeriğini ayrıştırma ediyoruz durumlarda söz düşünmek json.loads()üzerine içerikleri aksine, dosyanın dosya yolu olduğunu JSON :

json_file_path = "/path/to/example.json"

with open(json_file_path, 'r') as j:
     contents = json.loads(j.read())

Bunun bazen olabileceğini itiraf etmekten biraz utanıyorum:

contents = json.loads(json_file_path)

Şey .. Bazen olur. Teşekkürler btw çalıştı.
Sachin Kumar

Bence bu durumda kişi kullanmalı json.load().
Coddy

14

Dosyanızın kodlama biçimini kontrol edin ve dosyayı okurken karşılık gelen kodlama biçimini kullanın. Sorununuzu çözecektir.

with open("AB.json", encoding='utf-8', errors='ignore') as json_data:
     data = json.load(json_data, strict=False)

3
Bu benim için küçük bir değişiklikle işe yaradı encoding='utf-8', bu yüzden bazen birkaç şeyi denemeniz gerektiğini düşünüyorum.
RobertMyles

9

Çoğu zaman, bunun nedeni ayrıştırmaya çalıştığınız dizenin boş olması olacaktır:

>>> import json
>>> x = json.loads("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

json_stringÖnceden boş olup olmadığını kontrol ederek çözüm yapabilirsiniz :

import json

if json_string:
    x = json.loads(json_string)
else:
    // Your logic here
    x = {}

Kodumda daha fazla hata ayıklama yaparken ben aradım response.read()ve sonra başka bir çağrı Expecting value: line 1vb. Sonuçlandığında dehşete oldu . Hata ayıklama deyimi kaldırıldı ve sorun çözüldü.
Joe

Hata ayıklamak için, bu güzel web sitesini de kullanabilirsiniz jsonlint.com
Roelant

4

Kod çözme () çağrıldıktan sonra bile gömülü 0'lar olabilir. Replace () kullanın:

import json
struct = {}
try:
    response_json = response_json.decode('utf-8').replace('\0', '')
    struct = json.loads(response_json)
except:
    print('bad json: ', response_json)
return struct

2

İstekleri kullanarak tam olarak bu sorunu yaşadım. Christophe Roussy'e açıklaması için teşekkürler.

Hata ayıklamak için kullandım:

response = requests.get(url)
logger.info(type(response))

API'dan 404 yanıt alıyordum.


1
response.status_codeVeya ile basitleştirilebilir print(response.status_code).
TitanFighter

1

Ben istekleri ile aynı sorunu yaşıyordu (python kütüphanesi). O olması oldu accept-encodingbaşlığı.

Bu şekilde ayarlandı: 'accept-encoding': 'gzip, deflate, br'

Sadece istekten kaldırdım ve hatayı almayı bıraktım.


1

Benim için, istekte kimlik doğrulaması kullanmıyordu.


1

Benim için sunucu 200 dışında bir şey ile yanıt ve json biçimlendirilmiş değildi. Bunu json ayrıştırmadan önce yaptım:

# this is the https request for data in json format
response_json = requests.get() 

# only proceed if I have a 200 response which is saved in status_code
if (response_json.status_code == 200):  
     response = response_json.json() #converting from json to dictionary using json library

Benim için sorun buydu. Durum kodu 200 yerine 500 (dahili sunucu hatası) idi, bu nedenle json döndürülmedi ve bu nedenle json'un 1. satır 1 sütununda hiçbir şey yoktu. İstek durum kodunun beklediğiniz gibi olup olmadığını kontrol etmek her zaman iyidir.
thposs

1

Aynı sorunla karşılaştım, bir json dosyasından açılan json dizesini yazdırırken, json dizesinin 'ï »¿' ile başladığını ve bazı reserach yaparak dosyanın varsayılan olarak UTF-8 ile çözüldüğünü ve utf-8-sig kodlamasını değiştirerek, işaretleme çıkarılır ve sorun yok json yükler:

open('test.json', encoding='utf-8-sig')

0

Windows kullanıcısıysanız, Tweepy API veri nesneleri arasında boş bir satır oluşturabilir. Bu durum nedeniyle, "JSONDecodeError: Beklenen değer: satır 1 sütun 1 (karakter 0)" hatası alabilirsiniz. Bu hatayı önlemek için boş satırları silebilirsiniz.

Örneğin:

 def on_data(self, data):
        try:
            with open('sentiment.json', 'a', newline='\n') as f:
                f.write(data)
                return True
        except BaseException as e:
            print("Error on_data: %s" % str(e))
        return True

Referans: Twitter akış API'si Yok'tan JSONDecodeError ("Beklenen değer", s, err.value) değerini verir


Boş çizgilerin bir sorun olduğunu düşünmüyorum. Bu açıkça satır 1 sütun 1 üzerinde hata olduğunu belirtir. Ben bu çözüm, BOM dosyadan kaldırıyor çünkü çalışır. Hızlı bir şekilde doğrulayabilirsiniz: 1. Orijinal dosyanızın boyutunu kontrol edin (sağ tıklama> Özellikler), 134.859 bayt olabilir 2. Orijinal dosyayı Notepad ++ ile açın 3. Kodlamayı "UTF-8-BOM" yerine "UTF-8-BOM" olarak " UTF-8" . Kaydet 4. Boyutu tekrar kontrol edin. 134.856 (3 bayt daha az)
Alex 75

0

Sadece isteğin 200 durum koduna sahip olup olmadığını kontrol edin. Örneğin:

if status != 200:
    print("An error has occured. [Status code", status, "]")
else:
    data = response.json() #Only convert to Json when status is OK.
    if not data["elements"]:
        print("Empty JSON")
    else:
        "You can extract data here"

0

Python tabanlı bir web API'sının yanıtında böyle bir hata aldım .text, ancak beni buraya getirdi, bu yüzden bu benzer bir sorunu olan diğerlerine yardımcı olabilir (kullanırken bir aramada yanıt filtrelemek ve sorunları istemek çok zor requests..)

Kullanılması json.dumps()üzerine istek data ilanı benim için sorun giderilmiştir önce JSON bir doğru-kaçan dize oluşturmak için arg

requests.post(url, data=json.dumps(data))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.