2016-10-03 61 views
0

我试图甩掉这个JSON -类型错误:“任务:元: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解码了它,但仍然没有运气。我收到以下错误。

类型错误:“任务:元:newtask”不是JSON序列化

什么是不可序列关于上面的字符串?我无能为力。

+1

尝试json.dumps(yourObject .__ dict__),这里http://stackoverflow.com/questions/10252010/serializing-python-object-instance查看答案to-json – haifzhan

+0

“Still not luck” - 意思是什么,*完全*?当我试图重现这一点,并解码字节串,那么我有以下内容:'TypeError:datetime.datetime(2016,10,3,19,9,50,162098)不是JSON可串行化的 - 它确实不是。但那是一个不同的错误,你的问题应该反映出来。 –

+0

@Shamik,...向我们展示*你是如何解码对象的(然后序列化结果),所以我们可以判断它是正确的。 –

回答

1

字典中的“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

_I处理了它_那么你解决了你的问题呢?大! –

+0

@Shamik,如果你实际上想要JSON序列化的东西不同于你的问题中给出的东西(比如因为你将字符串修改为字符串),*更新问题以反映实际数据* - 但要确保(完全确定)可以在该状态下进行复制。 –