gpt4 book ai didi

python - Python 字典上的 json.dumps TypeError

转载 作者:太空宇宙 更新时间:2023-11-03 19:06:21 24 4
gpt4 key购买 nike

实现以下类是为了提供一个通用对象,该对象可以作为 json 编码字典通过网络传递。我实际上正在尝试对 dict (!) 进行 json 编码,但它不起作用。

我知道它可以与自定义编码器类一起使用,但我不明白为什么当我只是对字典进行编码时有必要。

有人可以解释 TypeError 或提供一种在不继承 JSONEncoder 的情况下对其进行编码的方法吗?

这是不良行为。

>>> def tree(): return CustomDict(tree)
>>> d = tree()
>>> d['one']['test']['four'] = 19
>>> d.dict
{ 'one' : { 'test': {'four': 19}}}
>>> type(d.dict)
<type 'dict'>
>>> import json
>>> json.dumps(d.dict)
# stacktrace removed
TypeError: {'one': {'test': {'four': 19}}} is not JSON serializable
>>> normal_d = {'one': {'test': {'four': 19}}}
>>> type(normal_d)
<type 'dict'>
>>> json.dumps(normal_d)
"{'one': {'test': {'four': 19}}}"
>>> normal_d == d
True

我很乐意能够执行以下操作

>>>> json.dumps(dict(d))
"{'one': {'test': {'four': 19}}}"

但我添加了 dict 属性来“强制它”(显然不起作用)。现在这是一个更大的谜团。这是 CustomDict 类的代码

class CustomDict(collections.MutableMapping):                                
"""
A defaultdict-like object that can also have properties and special methods
"""

def __init__(self, default_type=str, *args, **kwargs):
"""
instantiate as a default-dict (str if type not provided). Try to update
self with each arg, and then update self with kwargs.

@param default_type: the type of the default dict
@type default_type: type (or class)
"""
self._type = default_type
self._store = collections.defaultdict(default_type)
self._dict = {}

for arg in args:
if isinstance(arg, collections.MutableMapping):
self.update(arg)

self.update(kwargs)

@property
def dict(self):
return self._dict

def __contains__(self, key):
return key in self._store

def __len__(self):
return len(self._store)

def __iter__(self):
return iter(self._store)

def __getitem__(self, key):
self._dict[key] = self._store[key]
return self._store[key]

def __setitem__(self, key, val):
self._dict[key] = val
self._store[key] = val

def __delitem__(self, key):
del self._store[key]

def __str__(self):
return str(dict(self._store))

最佳答案

您确实想让您的类型成为 dict 的子类,而不是 collections.MutableMapping 的子类。

更好的是,直接使用 collections.defaultdict ,它已经是 dict 的子类,可以用来轻松实现您的树“类型”:

from collections import defaultdict

def Tree():
return defaultdict(Tree)

tree = Tree()

演示:

>>> from collections import defaultdict
>>> def Tree():
... return defaultdict(Tree)
...
>>> tree = Tree()
>>> tree['one']['two'] = 'foobar'
>>> tree
defaultdict(<function Tree at 0x107f40e60>, {'one': defaultdict(<function Tree at 0x107f40e60>, {'two': 'foobar'})})
>>> import json
>>> json.dumps(tree)
'{"one": {"two": "foobar"}}'

如果您必须添加自己的方法和行为,那么我将继承 defaultdict 并在此基础上构建:

class CustomDict(defaultdict):
pass

由于这仍然是 dict 的子类,因此 json 库会很乐意将其转换为 JSON 对象,而无需特殊处理。

关于python - Python 字典上的 json.dumps TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14631898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com