2015-03-09 2 views
2

У меня есть объект DictProxy, созданный с использованием multiprocessing.Manager().dict() для поддержки параллелизма. В конце прогона мне нужно сериализовать dict на JSON. Но неясно, как преобразовать DictProxy в сериализуемый объект dict. Когда я попробовал это, я получил:Как преобразовать объект DictProxy в JSON serializable dict?

TypeError: <DictProxy object, typeid 'dict' at 0x10a240ed0> is not JSON serializable 

Как это исправить?

ответ

7

Вместо того чтобы использовать частный DictProxy метод как _getvalue(), я предпочитаю использовать публичный один как copy() который возвращает неглубоко скопировано dict.

import multiprocessing 

if __name__ == '__main__': 
    manager = multiprocessing.Manager() 
    d = manager.dict() 
    import json 
    json.dumps(d.copy()) 
+0

Несмотря на соглашение об именах, '_getvalue()' документируется, поэтому он не является частным. Это также единственный вариант для объектов, у которых нет метода 'copy', хотя' copy' отлично работает для случая 'dict'. – dano

+0

@dano: Документировано ≠ Public – martineau

+0

Разработчики Core Python заявили, что документированные части API являются фактически публичным API (https://mail.python.org/pipermail/python-dev/2010-November/105667. HTML). – dano

2

Используйте dict_proxy._getvalue() для получения фактического dict экземпляра, лежащего в основе прокси, и передайте его json.dump (или любым другим способом, который вы используете).

>>> import multiprocessing 
>>> m = multiprocessing.Manager() 
>>> d = m.dict() 
>>> import json 
>>> json.dumps(d) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib64/python2.6/json/__init__.py", line 230, in dumps 
    return _default_encoder.encode(obj) 
    File "/usr/lib64/python2.6/json/encoder.py", line 367, in encode 
    chunks = list(self.iterencode(o)) 
    File "/usr/lib64/python2.6/json/encoder.py", line 317, in _iterencode 
    for chunk in self._iterencode_default(o, markers): 
    File "/usr/lib64/python2.6/json/encoder.py", line 323, in _iterencode_default 
    newobj = self.default(o) 
    File "/usr/lib64/python2.6/json/encoder.py", line 344, in default 
    raise TypeError(repr(o) + " is not JSON serializable") 
TypeError: <DictProxy object, typeid 'dict' at 0x97eed0> is not JSON serializable 
>>> json.dumps(d._getvalue()) 
'{}' 
Смежные вопросы