2012-07-10 13 views
7

Python'un None kodunun boş dizge olarak nasıl kodlanmasını istiyorum? json.dumps'un varsayılan davranışı aşağıdadır.Python: Json dökümleri boş dizgeyi boşaltmak için

>>> import json 
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) 
'["foo", {"bar": ["baz", null, 1.0, 2]}]' 

json kodlayıcı yönteminin üzerine yazmalı mıyım yoksa başka yolu var mı?

Teşekkürler! Her farklı veri yapısı değiştirilebilir talep üzerine

düzenleme

Girdi verileri, yukarıdaki örnekte olduğu gibi bu basit değildir. Veri yapısını değiştirmek için bir işlev yazmak zor.

+2

Gerçek cevabı istiyorsanız o zaman daha iyi bir gerekçe sağlamanız gerekecek ... –

+0

Giriş verilerim yukarıdaki örnekte olduğu gibi kolay değil, bu yüzden 'Yok' ifadesini boş dizgeye dönüştürmeyi düşünüyorum. json.dumps' aracılığıyla. – Ahsan

+1

None' boş bir dize ile aynı şey değildir 'unutulmamalıdır; bu yüzden bunu değiştirirken aklınızda bulundurun. 'Yok' doğru eşdeğeri 'null' –

cevap

8

Kodlama yaptığınız nesnede, None yerine boş bir dize kullanın.

Tüm None değerlerini '' olarak değiştirmek için bir dizi iç içe geçmiş sözlükten geçen test edilmemiş bir işlev. Listelere ve tuplelere destek eklenmesi okuyucuya bir egzersiz olarak bırakılır. :)

import copy 

def scrub(x): 
    ret = copy.deepcopy(x) 
    # Handle dictionaries. Scrub all values 
    if isinstance(x, dict): 
     for k,v in ret.items(): 
      ret[k] = scrub(v) 
    # Handle None 
    if x == None: 
     ret = '' 
    # Finished scrubbing 
    return ret 
3

Size kodlamak ve boş dizeleri ile None s değiştirmek istediğiniz verileri işlemek için daha iyi olurdu. Sonuçta, istediğin bu. jsonschmea modülünü kullanırken

def scrub(x): 
    # Converts None to empty string 
    ret = copy.deepcopy(x) 
    # Handle dictionaries, lits & tuples. Scrub all values 
    if isinstance(x, dict): 
     for k, v in ret.items(): 
      ret[k] = scrub(v) 
    if isinstance(x, (list, tuple)): 
     for k, v in enumerate(ret): 
      ret[k] = scrub(v) 
    # Handle None 
    if x is None: 
     ret = '' 
    # Finished scrubbing 
    return ret 

bunu kullandı: Burada

2

yanı listeleri ve dizilerini kolları biraz geliştirilmiş bir versiyonudur. O None türünü işleyemez görünüyor ve atar: jsonschema.exceptions.ValidationError: None is not of type u'string'. Yani bu sorunla ilgilenir.