[fix] implement a JSONEncoder for the json format

This patch implements a simple JSONEncoder just to fix #2502 / on the long term
SearXNG needs a data schema for the result items and a json generator for the
result list.

Closes: https://github.com/searxng/searxng/issues/2505
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
This commit is contained in:
Markus Heiser 2023-06-18 18:14:46 +02:00 committed by Markus Heiser
parent fa1ef9a07b
commit 86db08793b
1 changed files with 12 additions and 1 deletions

View File

@ -143,6 +143,17 @@ def write_csv_response(csv: CSVWriter, rc: ResultContainer) -> None:
csv.writerow([row.get(key, '') for key in keys]) csv.writerow([row.get(key, '') for key in keys])
class JSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, datetime):
return o.isoformat()
if isinstance(o, timedelta):
return o.total_seconds()
if isinstance(o, set):
return list(o)
return super().default(o)
def get_json_response(sq: SearchQuery, rc: ResultContainer) -> str: def get_json_response(sq: SearchQuery, rc: ResultContainer) -> str:
"""Returns the JSON string of the results to a query (``application/json``)""" """Returns the JSON string of the results to a query (``application/json``)"""
results = rc.number_of_results results = rc.number_of_results
@ -156,7 +167,7 @@ def get_json_response(sq: SearchQuery, rc: ResultContainer) -> str:
'suggestions': list(rc.suggestions), 'suggestions': list(rc.suggestions),
'unresponsive_engines': get_translated_errors(rc.unresponsive_engines), 'unresponsive_engines': get_translated_errors(rc.unresponsive_engines),
} }
response = json.dumps(x, default=lambda item: list(item) if isinstance(item, set) else item) response = json.dumps(x, cls=JSONEncoder)
return response return response