django 错误:ValueError: Circular reference detected,具体错误信息:
File "C:\Python27\MyDjango\jianzhi_002\jianzhi_app\views.py", line 418, in wx_get_job_detail return HttpResponse(json.dumps({'message': message, 'data': detail_data})) File "C:\Python27\lib\json\__init__.py", line 244, in dumps return _default_encoder.encode(obj) File "C:\Python27\lib\json\encoder.py", line 207, in encode chunks = self.iterencode(o, _one_shot=True) File "C:\Python27\lib\json\encoder.py", line 270, in iterencode return _iterencode(o, 0) ValueError: Circular reference detected
错误意思:存在循环引用。
代码重现:
import json a = b = c = {} # 将b c 存到 a a['b'] = b a['c'] = c json.dumps(a)
错误提示:
ValueError Traceback (most recent call last) <ipython-input-5-2f50cf32d976> in <module>() ----> 1 json.dumps(a) /usr/lib/python2.7/json/__init__.pyc in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, encoding, default, sort_keys, **kw) 241 cls is None and indent is None and separators is None and 242 encoding == 'utf-8' and default is None and not sort_keys and not kw): --> 243 return _default_encoder.encode(obj) 244 if cls is None: 245 cls = JSONEncoder /usr/lib/python2.7/json/encoder.pyc in encode(self, o) 205 # exceptions aren't as detailed. The list call should be roughly 206 # equivalent to the PySequence_Fast that ''.join() would do. --> 207 chunks = self.iterencode(o, _one_shot=True) 208 if not isinstance(chunks, (list, tuple)): 209 chunks = list(chunks) /usr/lib/python2.7/json/encoder.pyc in iterencode(self, o, _one_shot) 268 self.key_separator, self.item_separator, self.sort_keys, 269 self.skipkeys, _one_shot) --> 270 return _iterencode(o, 0) 271 272 def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,ValueError: Circular reference detected
究其原因,是因为 a b c 实际上指向的是同一个对象的引用。
解决办法:
import json a, b , c = {}, {}, {} # 将b c 存到 a a['b'] = b a['c'] = c json.dumps(a)
总结:
一般遇到ValueError: Circular reference detected错误,是因为同一个变量被循环引用导致的bug。检查代码中哪一个变量被循环引用,更改变量名就可以。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。