在请求库中处理Decimal到Json

时间:2016-05-10 11:14:30

标签: python json python-requests

我试图将帖子数据发送到需要在json中的api。如果请求标头没有Content-type: application-json请求失败,我会收到HTTPError: 415 Client Error: Unsupported Media Type for url

但是,如果我使用内置的json解析器,请求似乎只会在此标头中添加。尽管文档似乎表明以下内容是等效的:

>>> r = requests.post(url, data=json.dumps(payload))

>>> r = requests.post(url, json=payload)

这意味着我需要使用内置的json解析器(或手动添加Content-type头)。

但是我的帖子数据有几个Decimal字段(从api转换为json.loads(response.text, parse_float=decimal.Decimal)保存在django DecimalField中),当使用内置请求解析器时会出错:

TypeError: Decimal('1560.35') is not JSON serialisable

有没有办法可以在请求中使用不同的json解析器(例如,处理小数的simplejson)并且仍然指定了内容类型。

3 个答案:

答案 0 :(得分:2)

可以通过自定义函数序列化小数。

def decimal_default(obj):
    if isinstance(obj, Decimal):
        return str(obj)
    raise TypeError


data = json.dumps(payload, default=decimal_default)

response = requests.post(
    url=url,
    data=data,
    headers={
        'Content-type': 'application/json',
    }
)

答案 1 :(得分:1)

我不知道如何使用不同的json解析器,但你可以设置标题(以及内容类型)。

r = requests.post(url, data=json.dumps(payload), headers={'Content-type': 'application/json'})
# or with a session object
s = requests.Session()
s.headers['Content-Type'] = 'application/json'
s.post(url, data=json.dumps(payload))

答案 2 :(得分:0)

只需安装simplejsonrequests将使用它来序列化小数:

$ pip3 install simplejson    

这不再引发TypeError

>>> requests.post(url, json={'foo': Decimal('1.23')})