繁体   English   中英

在 python 中构建 json 响应

[英]build json response in python

我正在尝试将异常捕获到一个 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:

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

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

我正在尝试在输出 ['message'] json object 中捕获整个异常消息。 知道我做错了什么吗?

因为err是 object 本身的异常,不是 JSON 可序列化的,所以不能在json.dumps()中传递。 您需要通过执行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