출력을 JSON으로 직렬화하는 중 - ValueError: 순환 참조가 탐지됨
mysql 쿼리 결과를 JSON에 출력하려고 합니다.datetime.datetime 필드를 시리얼화하는 데 문제가 있어 이를 위해 작은 함수를 작성했습니다.
def date_handler(obj):
if hasattr(obj, 'isoformat'):
return obj.isoformat()
else:
return obj
기본 코드로 실행 중입니다.
products_json = []
for code in best_matching_codes:
cur = db.cursor()
query = "SELECT * FROM %s WHERE code LIKE '%s'" % (PRODUCTS_TABLE_NAME, product_code)
cur.execute(query)
columns = [desc[0] for desc in cur.description]
rows = cur.fetchall()
for row in rows:
products_json.append(dict((k,v) for k,v in zip(columns,row)))
return json.dumps(products_json, default = date_handler)
그러나 date_handler 함수를 썼기 때문에 "ValueError: Circular reference detected"라고 표시됩니다.
127.0.0.1 - - [10/Jan/2013 00:42:18] "GET /1/product?code=9571%2F702 HTTP/1.1" 500 -
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/flask/app.py", line 1701, in __call__
return self.wsgi_app(environ, start_response)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1689, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Library/Python/2.7/site-packages/flask/app.py", line 1687, in wsgi_app
response = self.full_dispatch_request()
File "/Library/Python/2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request
rv = self.dispatch_request()
File "/Library/Python/2.7/site-packages/flask/app.py", line 1344, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/pisarzp/Desktop/SusyChoosy/susyAPI/test1.py", line 69, in product_search
return json.dumps(products_json, default = date_handler)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
ValueError: Circular reference detected
내가 뭘 깨뜨렸지?출력을 JSON으로 시리얼화하는 더 좋은 방법이 있습니까?
사용자가 전달한 함수로 전달된 함수는default
인수는 에 의해 네이티브하게 시리얼화되지 않은 오브젝트에 대해서만 호출됩니다.json
모듈.시리얼 가능한 개체를 반환하거나 TypeError를 발생시켜야 합니다.
수정(날짜) 중인 개체가 아닌 경우 전달된 개체와 동일한 개체가 버전에 반환됩니다.이로 인해 순환 참조 오류가 발생합니다(원형이 처리된 후 개체와 개체 사이에 있기 때문에 오해의 소지가 있음).date_handler
).
이 문제를 해결하려면date_handler
그 점에서 예외를 두다else
블록. 그래도 실패할 수 있지만 다음과 같은 코드를 사용하여 문제를 일으키는 데이터 구조 내의 객체가 무엇인지 알 수 있습니다.
def date_handler(obj):
if hasattr(obj, 'isoformat'):
return obj.isoformat()
else:
raise TypeError(
"Unserializable object {} of type {}".format(obj, type(obj))
)
를 올리는 대신TypeError
콜을 직접 릴레이하여JSONEncoder
의 디폴트 설정:
def date_handler(obj):
if hasattr(obj, 'isoformat'):
return obj.isoformat()
else:
json.JSONEncoder.default(self,obj)
이것은 또한 상승할 것이다.TypeError
더 좋은 방법인 것 같습니다.JSONEncoder
메서드로 인코딩할 수 없는 유형을 시도합니다.
json.dumps(obj, default=method_name)
"serialize_name" 함수는 serialize 개체를 반환해야 합니다.
def method_name(obj):
data = {
'__class__': obj.__class__.__name__,
'__module__': obj.__module__
}
data.update(obj.__dict__)
return data
언급URL : https://stackoverflow.com/questions/14249115/serializing-output-to-json-valueerror-circular-reference-detected
'programing' 카테고리의 다른 글
Jest와 효소의 차이점은 무엇입니까? (0) | 2023.03.27 |
---|---|
wordpress에서 캐시를 사용하지 않도록 설정하는 방법 (0) | 2023.03.27 |
Next 또는 Gatsby vs Create React App 등의 리액트 프레임워크를 사용하는 경우 (0) | 2023.03.17 |
Woocommerce 카테고리 미리 보기 가져오기 (0) | 2023.03.17 |
Angularjs:$routeProvider에서 'resolve'를 사용할 때 loading-icon을 표시하는 방법은 무엇입니까? (0) | 2023.03.17 |