简体   繁体   English

在 python 中构建 json 响应

[英]build json response in python

I am trying to capture exceptions into one json object and print the output我正在尝试将异常捕获到一个 json object 并打印 output

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))

Output: 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:\ServiceNow\Teradatacsdev\agent\scripts\TDCloudNSPythonLibrary\helloworld.py", line 30, in <module>
    print (json.dumps(output))
  File "C:\Program Files\Python38\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:\Program Files\Python38\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Program Files\Python38\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Program Files\Python38\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type ConnectionError is not JSON serializable

Expected output:预期 output:

{"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'))"}

I am trying to capture entire exception message in output['message'] json object.我正在尝试在输出 ['message'] json object 中捕获整个异常消息。 Any idea if I am doing anything wrong?知道我做错了什么吗?

Because err is the exception object itself, which is not JSON serializable, so you cannot pass it in json.dumps() .因为err是 object 本身的异常,不是 JSON 可序列化的,所以不能在json.dumps()中传递。 You need to convert it to a str by doing json.dumps(str(err))您需要通过执行json.dumps(str(err))将其转换为 str

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))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM