【发布时间】:2013-06-01 01:35:33
【问题描述】:
我有一个类似CalvinKrishy's problem 的问题 Samplebias 的解决方案不适用于我拥有的数据。
我正在使用 Python 2.7。
这是数据:
命名元组
>>> a_t = namedtuple('a','f1 words')
>>> word_t = namedtuple('word','f2 value')
>>> w1 = word_t(f2=[0,1,2], value='abc')
>>> w2 = word_t(f2=[3,4], value='def')
>>> a1 = a_t(f1=[0,1,2,3,4],words=[w1, w2])
>>> a1
a(f1=[0, 1, 2, 3, 4], words=[word(f2=[0, 1, 2], value='abc'), word(f2=[3, 4], value='def')])
字典
>>> w3 = {}
>>> w3['f2'] = [0,1,2]
>>> w3['value'] = 'abc'
>>> w4 = {}
>>> w4['f2'] = [3,4]
>>> w4['value'] = 'def'
>>> a2 = {}
>>> a2['f1'] = [0, 1, 2, 3, 4]
>>> a2['words'] = [w3,w4]
>>> a2
{'f1': [0, 1, 2, 3, 4], 'words': [{'f2': [0, 1, 2], 'value': 'abc'}, {'f2': [3, 4], 'value': 'def'}]}
你可以看到 a1 和 a2 都是一样的,除了一个是 namedtuple 而另一个是 dict。
但是 json.dumps 不同:
>>> json.dumps(a1._asdict())
'{"f1": [0, 1, 2, 3, 4], "words": [[[0, 1, 2], "abc"], [[3, 4], "def"]]}'
>>> json.dumps(a2)
'{"f1": [0, 1, 2, 3, 4], "words": [{"f2": [0, 1, 2], "value": "abc"}, {"f2": [3, 4], "value": "def"}]}'
我希望 a1 的 json 格式与它为 a2 所做的完全一样。
【问题讨论】:
-
namedtuple 是 tuple 的子类,因此 JSON 按其应有的方式将它们序列化为列表。
-
但是 docs.python.org/dev/library/… 返回一个 OrderedDict
-
那是一个实用方法;将您的元组转换为有序字典,然后再序列化为 JSON。
-
您可以创建编码器的自定义子类来处理命名元组:Overriding nested JSON encoding of inherited default supported objects like dict, list
-
@MartijnPieters 在这种情况下,您不能覆盖 json 编码器的行为,因为它将命名元组视为元组。
标签: python json python-2.7 namedtuple