2016-10-03 8 views
0

私はこのJSONダンプしようとしています -はTypeError: 'タスク:メタ:付けたnewtaskは' JSONではありません、シリアライズ

{'total_run_count': 9, 'task': 'tasks.add', 'enabled': True, 'schedule': {'period': 'seconds', 'every': 3}, 'kwargs': {'max_targets': 100}, 'running': False, 'options': {}, 'delete_key': 'deleted:tasks:meta:newtask', 'name': b'tasks:meta:newtask', 'last_run_at': datetime.datetime(2016, 10, 3, 19, 9, 50, 162098), 'args': ['3', '2'], 'key': 'tasks:meta:newtask'} 

をし、それがキー '名前' で失敗しました。私はutf-8でデコードしましたが、まだ運がありません。次のエラーが表示されます。

はTypeError: 'タスク:メタ:付けたnewtask' JSONは、上記の文字列について、シリアライズないもの

直列化可能ではないでしょうか?私は無知です。その項目が辞書に表示されているか

+1

は(yourObject .__ dict__に)json.dumpsを試してみてください、ここで答えをチェックしhttp://stackoverflow.com/questions/10252010/serializing-python-object-instance -to-json – haifzhan

+0

「まだ運がありません」 - 意味は、*正確に*?これを再現しようとすると、バイトテストをデコードすると、次のようになります: 'TypeError:datetime.datetime(2016,10,3,19,9,50,162098)はJSONのシリアライザブルではありません。確かにそうではありません。しかし、これは違うエラーです。あなたの質問にはそれが反映されるはずです。 –

+0

@Shamik、...あなたがオブジェクトをデコードしようとしている(そして結果をシリアライズしています)ので、正しく完了したことを伝えることができます。 –

答えて

1

あなたのdictの "name"値は、文字列ではなくbytesオブジェクトです。あなたはそれをデコードする必要があるか、あなたのcustom JSON encoderを書き込むことができます。

import json 

def default(o): 
    if isinstance(o, bytes): 
     return o.decode() 
    return json.JSONEncoder.default(self, o) 

data = {'name': b'tasks:meta:newtask'} 
json.JSONEncoder(default=default).encode(data) 
+0

このデータの唯一の問題ではありません。少なくともPython 3.4.5では、 'datetime.datetime'オブジェクトはJSON直列化もできません。 –

+0

@CharlesDuffy、それは良い点です!これを処理する 'default'関数を拡張するのは簡単です。 – skovorodkin

1

お知らせ:

'name': b'tasks:meta:newtask' 

bをリードする「タスク:メタ:付けたnewtaskは」ことを示しバイト文字列ではなく、通常の文字列です。 JSONはバイト文字列オブジェクトの処理方法がわからないことを伝えています。

本当にバイト文字列である必要がありますか?そうでない場合は、json dumpを呼び出す前に通常の文字列に変換する必要があります。

+0

私はutf-8でそれをデコードして処理しました。エラーが表示された場合は先頭にbが付きません。 – Shamik

+0

_私はそれを処理しています_あなたはあなたの問題を解決しましたか?すばらしいです! –

+0

@Shamik、あなたが実際にJSON-serializeしようとしているものがあなたの質問に与えられているものと違う場合(バイト文字列を文字列に変更しているなど)*質問を更新して実際のデータを反映* - それがその状態で再生できることを(完全に、100%確実に)確認してください。 –

関連する問題