2012-07-10 9 views
7

私はPythonのNoneを空の文字列としてjsonでエンコードしたいですか?デフォルト動作はjson.dumpsです。Python:どのようにjsonのダンプなしの空の文字列に

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

jsonエンコーダ方式を上書きする必要がありますか?

ありがとうございます!すべては、それが別のデータ構造に変更することができる要求に

編集

入力データは、上記の例のように、その単純ではありません。データ構造を変更するための関数を書くのは難しい。

+2

本当の答えが必要な場合は、より良い正当性を提供する必要があります。 –

+0

私の入力データは上の例のように単純ではないので、空の文字列に 'None'を変更しようとしています'json.dumps'を通して。 – Ahsan

+1

「None」は空文字列と同じではないことに注意してください。変換時にそのことを覚えておいてください。 –

答えて

8

エンコードするオブジェクトにNoneの代わりに空の文字列を使用します。

ここには、の値をすべて''に変更するための一連のネストされた辞書があります。リストとタプルのサポートを追加することは、読者の練習として残されています。 :)

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

Noneをエンコードして置き換えるデータを処理して空の文字列に置き換える方がよいでしょう。結局のところ、それはあなたが望むものです。 jsonschmeaモジュールを使用する場合、私はそれを使用し

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 

:ここ

2

もリストやタプルを処理するわずかに改善されたバージョンです。それはNoneタイプを処理することができないと思われ、スロー:jsonschema.exceptions.ValidationError: None is not of type u'string'。これは問題を処理します。

関連する問題