2017-12-17 13 views
1

辞書を入れ子にしたJson(Python 2.7)に解析しています。私は時には変数に価値がないので、変数がないかどうか、変数が来るかどうかによって異なります。大丈夫ですが、私は引用の前にエスケープ文字を避けたいです。私が入れ子になったJsonを取得する前に、私はjson.loads()を実行して文字列エスケープを削除します。Pythonはエラーを出さずにJsonにNoneをロードします

dictがない場合はNoneを返すのが問題です。

例コード:

import json 

data1 = '{"foo":"bar"}' 
data2 = None 
sensor = {'header':'Info', 
      'data1': json.loads(data1), 
      'data2': json.loads(data2)} 
output = json.dumps(sensor) 
print(output) 

予想される結果:

{"data2": null, "data1": {"foo": "bar"}, "header": "Info"} 

受信したエラー:

Traceback (most recent call last): 
    File "\jsonDecoding.py", line 7, in <module> 
    'data2': json.loads(data2)} 
    File "\Python\Python35\lib\json\__init__.py", line 312, in loads 
    s.__class__.__name__)) 
TypeError: the JSON object must be str, not 'NoneType' 

試み溶液:

class Decoder(json.JSONDecoder): 
    def default(self, obj): 
     if obj is None:: 
      return None 
     else: return super(Decoder, self).default(obj) 

data1 = '{"foo":"bar"}' 
data2 = None 
sensor = {'header':'Info', 
      'data1': json.loads(data1), 
      'data2': json.loads(data2, cls=Decoder)} 
output = json.dumps(sensor) 

私はDecoder.default()の実装は問題を解決するはずだが、クラスを呼び出すが、デフォルトメソッドを呼び出さないと思った。

keyまたはvalueの代わりにNoneについての協議がたくさんありますが、私はあなたが難しく、それがあるよりも、問題を作ると思うオブジェクト全体

+0

いいえ、 'data2'はあなたが' json.loads'するので、 '' null''でなければなりません。 –

+0

'data2'はセンサーからの元の変数です。これは 'data1'と同じフォーマットの' json'の形式の文字列として来るか、全く来ないので 'None'です。たとえば 'blablabla'のようにJSON以外の文字列を既に持っている可能性があるので、' 'ヌル ''として – Tos

答えて

2

の代わりに見つけることができませんでした。

def nonesafe_loads(obj): 
    if obj is not None: 
     return json.loads(obj) 

これは場合objjson.loads(obj)Noneではなく、それ以外の場合はNoneを返しますが返されます:私たちは、None -safe機能を構築することができます。

def besteffort_loads(obj): 
    try: 
     return json.loads(obj) 
    except (TypeError, ValueError): 
     return obj 

は、今、私たちはただのプログラムで私たちのnonesafe_loadsを使用することができます:

それとも obj自体を返し、失敗した場合には json.loadsに文字列を目指し、または「ベストエフォート」JSON負荷を構築することができます
data1 = '{"foo":"bar"}' 
data2 = None 
sensor = {'header':'Info', 
      'data1': nonesafe_loads(data1), 
      'data2': nonesafe_loads(data2)} 
output = json.dumps(sensor)
+1

@ZeroPiraeus:おそらく' ValueError'となることはありません。そして、逆直列化を省略したいと思います。 –

+0

@ZeroPiraeus:Python-2.xでは 'ValueError'はありません。大括弧は実際にはありません:) –

関連する問題