построить ответ json на python

#python #json #python-requests

#python #json #python-запросы

Вопрос:

Я пытаюсь записать исключения в один объект json и распечатать выходные данные

 import json, sys, traceback
import requests
output = {}
try:
    r = requests.get('http://wwww.google.com/nothere')
    r.raise_for_status()
    print(r)

except requests.exceptions.Timeout as et:
    output['status_code']='TIMEOUT'
    output['status']='failed'
    output['message']= json.dumps(et)
    #print("Timeout: ",et)
except requests.exceptions.HTTPError as eh:
    output['status_code']='HTTPError'
    output['status']='failed'
    output['message'] = json.dumps(eh)
    #print("HTTPError: ",eh)
except requests.exceptions.ConnectionError as errc:
    output['status_code']='ConnectTimeout'
    output['status']='failed'
    errorMessage = errc
    print("Message: ",errorMessage)
    output['message'] = errorMessage
    #print ("Error Connecting:",errc)
except requests.exceptions.RequestException as err:
    output['status_code']='GENErr'
    output['status']='failed'
    output['message'] = json.dumps(err)
print (json.dumps(output))
 

Вывод:

 Message: HTTPConnectionPool(host='wwww.google.com', port=80): Max retries exceeded with url: /nothere (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000001B3A54384C0>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
Traceback (most recent call last):
  File "C:ServiceNowTeradatacsdevagentscriptsTDCloudNSPythonLibraryhelloworld.py", line 30, in <module>
    print (json.dumps(output))
  File "C:Program FilesPython38libjson__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:Program FilesPython38libjsonencoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:Program FilesPython38libjsonencoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:Program FilesPython38libjsonencoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type ConnectionError is not JSON serializable
 

Ожидаемый результат:

 {"status_code": "ConnectTimeout", "status": "failed", "message":"HTTPConnectionPool(host='wwww.google.com', port=80): Max retries exceeded with url: /nothere (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000001C5F15684C0>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))"}
 

Я пытаюсь захватить все сообщение об исключении в объекте output [‘message’] json. Есть идеи, если я делаю что-то не так?

Ответ №1:

Потому err что это сам объект исключения, который не является сериализуемым в формате JSON, поэтому вы не можете передать его json.dumps() . Вам нужно преобразовать его в str, выполнив json.dumps(str(err))

Ответ №2:

 import json, sys, traceback
import requests
output = {}
try:
    r = requests.get('http://wwww.google.com/nothere')
    r.raise_for_status()
    print(r)

except requests.exceptions.Timeout as et:
    output['status_code']='TIMEOUT'
    output['status']='failed'
    output['message']= json.dumps(str(et))
    #print("Timeout: ",et)
except requests.exceptions.HTTPError as eh:
    output['status_code']='HTTPError'
    output['status']='failed'
    output['message'] = json.dumps(str(eh))
    #print("HTTPError: ",eh)
except requests.exceptions.ConnectionError as errc:
    output['status_code']='ConnectTimeout'
    output['status']='failed'
    errorMessage = errc
    print("Message: ",errorMessage)
    output['message'] = str(errorMessage)
    #print ("Error Connecting:",errc)
except requests.exceptions.RequestException as err:
    output['status_code']='GENErr'
    output['status']='failed'
    output['message'] = json.dumps(str(err))
print (json.dumps(output))