2012-02-08 15 views
26

Bir JSON nesnesini bir Python dict içine ayrıştırmaya çalışıyorum. Bunu daha önce hiç yapmadım. Bu özel hataya baktığımda, (İlk char? ile ilgili sorun nedir?), Diğer iletiler yüklenmekte olan dizenin aslında bir JSON dizesi olmadığını söylediler. Yine de eminim ki bu.Python'da JSON ayrıştırmaya çalışıyorum. ValueError: Özellik adı bekleniyor

Bu durumda, eval() iyi çalışıyor, ancak daha uygun bir yol olup olmadığını merak ediyorum?

Not: Bu dize, ptt araçlarıyla doğrudan Twitter'dan gelir.

>>> import json 
>>> line = '{u\'follow_request_sent\': False, u\'profile_use_background_image\': True, 
     u\'default_profile_image\': False, 
     u\'verified\': False, u\'profile_sidebar_fill_color\': u\'DDEEF6\', 
     u\'profile_text_color\': u\'333333\', u\'listed_count\': 0}' 
>>> json.loads(line) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 326, in loads 
     return _default_decoder.decode(s) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode 
     obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode 
     obj, end = self.scan_once(s, idx) 
    ValueError: Expecting property name: line 1 column 1 (char 1) 
+8

Bu sadece python sözdizimi, JSON değil. Güvenli değerlendirme için 'ast.literal_eval' kullanın – JBernardo

cevap

28

Bu kesinlikle JSON değil - her nasılsa yukarıda gösterildiği gibi değil. Bu zaten bir Python nesnesine ayrıştırıldı - JSON, False değil, false olurdu ve unicode için u olarak dizeleri göstermeyecekti (tüm JSON dizeleri unicode'dur). Json dizginizi zincirin içinde bir yerde bir Python nesnesine dönüştürmediğinizden emin misiniz ve bu yüzden json.loads() 'a yüklüyorsunuz, çünkü aslında bir ip değil?

+2

Tam olarak sorun buydu. Teşekkürler. – gabe

27

Bazen dize değerleriniz python tarafından iyi tanınamadığından bu hatayı alabilirsiniz. Örnek olarak: Bu tür bir hatanın kaynağını bulmak için epey zaman harcadım. İşte bulduğum şey. Tüm tırnak JavaScript json içine bir dize ayrıştırmak için 'biçiminde

olmak zorunda JavaScript json için bir dize ayrıştırmak btw :

Bazen dil bir tırnak tür değil bir tane tanır tüm tırnak gerçekten mantık değil "biçiminde olmak zorunda

Umarım işlevini yerine kullanabilirsiniz Python için:..

json.loads(s.replace("\'", '"')); 

size bu avcılık harcadım zaman kazandıracak Umut böcek!

+0

Karşılaştığım konu budur. Teşekkürler – Alireza

+0

JSON'daki JavaScript'teki alıntılarla ilgili cevabınızın bir kısmı biraz çelişkili görünüyor. Her iki değişkeni de JavaScript’te (Chrome’da) yaptım ve test ettim (https://jsbin.com/pupayajoni/1/edit?js,console). Sonuç: üçüncü paragrafınız doğru: standart JavaScript ayrıştırıcısı, dize değişmez sınırları olarak tek tırnaklara izin vermez. –

+1

BTW [JSON belirtimi] (http://www.json.org) yalnızca çift tırnak içine sarılmış dizelere izin verir, bu nedenle bu davranış JavaScript ve Python JSON ayrıştırıcılarına özgü değildir. –

7

Özelliklerin listesinin sonunda asılı bir virgül olduğunda bu hatayı aldım. Virgül nedeniyle başka bir özellik adı bekliyordu ama hiçbiri yoktu.

+1

JSON'un takip eden virgüllere izin vermeyeceği böylesine aptalca bir şey! Ve, json.load'un size sadece 'ValueError: çift tırnak içine alınan özellik adını beklemesini' sağlayan mutlak bir yokluğu – Ufos

0

JSON dosyanızın // numaralı satırlarla başlatılmamış olduğundan emin olun (yorumların yanlış yazılması gerekir!). Aynı ValueError iletisine sahibim ve dosyamdan // kaldırdıktan sonra gitti.

İlgili konular