2012-07-10 14 views
7

Chcę, aby Python None został zakodowany w jsonie jako pusty ciąg, jak? Poniżej znajduje się domyślne zachowanie json.dumps.Python: Jak json zrzuca None do pustego łańcucha

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

Czy powinienem nadpisać koder json, czy jest jakiś inny sposób?

Dzięki!

Edit

Dane wejściowe nie jest tak proste, jak w powyższym przykładzie, na każde żądanie mogła ona zostać zmieniona na inną strukturę danych. Trudno jest napisać funkcję do zmiany struktury danych.

+2

Jeśli chcesz uzyskać prawdziwą odpowiedź, musisz podać lepsze uzasadnienie ... –

+0

Moje dane wejściowe nie są takie proste jak w powyższym przykładzie, więc szukam zmiany "Brak" na pusty ciąg przez 'json.dumps'. – Ahsan

+1

Należy zauważyć, że "None" nie jest tym samym, co pusty ciąg; więc miej to na uwadze podczas konwersji. Prawidłowym odpowiednikiem 'None' jest' null' –

Odpowiedz

8

W obiekcie, który kodujesz, użyj pustego ciągu znaków zamiast None.

Oto nieprzetestowana funkcja przechodząca przez serie zagnieżdżonych słowników w celu zmiany wszystkich wartości None na ''. Dodawanie obsługi list i krotek jest pozostawione ćwiczeniu dla czytelnika. :)

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

Byłoby lepiej, aby przetwarzać dane, które chcesz kodować i zastąpić None S z pustych strunach. W końcu to jest to, czego chcesz.

2

Oto nieznacznej poprawie w wersji, która obsługuje listy i krotki, a także:

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 

użyłem go przy użyciu modułu jsonschmea. Wygląda na to, że nie może obsłużyć typu None i rzuca: jsonschema.exceptions.ValidationError: None is not of type u'string'. To rozwiązuje problem.

Powiązane problemy