2012-06-20 30 views
1

我有大致如下的datetime.datetime对象和namedtuples嵌套Python数据结构:的Python:Json的编码具有namedtuples嵌套数据结构,日期

from datetime import datetime as dt 
from datetime import timedelta 
from collections import namedtuple 
nt = namedtuple('n', 'name, contact') 
f1 = nt('jules', '1234') 
f2 = nt('dan', '5678') 
x = [ 
    [dt.now() + timedelta(minutes=1), f1], 
    [dt.now() + timedelta(hours=1), f2], 
    ] 

和编码器是这样的:

import json 
class TestEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if hasattr(obj, 'isoformat'): 
      return obj.isoformat() 
     else: 
      return json.JSONEncoder.default(self, obj) 

print json.dumps(x, cls=TestEncoder)输出:

[["2012-06-21T00:48:03.296381", ["jules", "1234"]], 
["2012-06-21T01:47:03.296423", ["dan", "5678"]]] 

我会要想打开namedtuples成类型的字典(可能使用namedtuple ._asdict()方法),得到以下的输出:

[["2012-06-21T00:48:03.296381", {"name":"jules", "contact":"1234"}], 
["2012-06-21T01:47:03.296423", {"name":"dan", "contact":"5678"}]] 

我怎么能保持一般的数据结构,但JSON转储namedtuples为http://stardict.sourceforge.net/Dictionaries.php下载?

+3

有问题吗? –

+0

我已经添加了一行“我如何保留通用数据结构,但json将namedtuples转储为字典?”在问题的最后,让问题更清楚。谢谢。 – rorycl

回答

4

后重新阅读文档,这似乎使用内置的json LIB作为唯一覆盖机制(default)只得到所谓认识的类型(包括元组)

simplejson是不可能给予使得这个小您namedtuple_as_object标志simplejson.dump

simplejson.dumps(x, cls=TestEncoder, namedtuple_as_object=True) 
+0

试过 - 它不起作用。它返回'[[“2012-06-21T01:47:55.539578”,[“jules”,“1234”]],[“2012-06-21T02:46:55.539622”,[“dan”,“5678”] ]]'...我也认为你的第三行中的:对象位不正确。 – rorycl

+0

@ rorycl正确,刚刚编辑出来的OP代码以及 – tobyodavies

+0

这似乎与简单json而不是Python 2.7上的json一起工作。即'将simplejson导入为json'允许代码按原样工作。 – rorycl