2016-05-10 5 views
0

jsonにある必要があるAPIに投稿データを送信しようとしています。要求ヘッダーにContent-type: application-jsonがない場合、要求は失敗し、私はHTTPError: 415 Client Error: Unsupported Media Type for urlを返します。Decimal to Jsonをリクエストライブラリで処理する

ただし、inbuilt jsonパーサーを使用すると、このヘッダーに要求が追加されるようです。ドキュメントは以下を示唆しているように見えるにもかかわらず同等である:

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

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

私は(Content-Typeヘッダを追加するか、または手動で)JSONパーサーに建て使用する必要があることを意味します。作り付けのリクエストパーサを使用して

私のポストデータは、いくつかの小数のフィールドを持っているしかしが(APIからジャンゴDecimalFieldはに保存するjson.loads(response.text, parse_float=decimal.Decimal)を経由して変換された)エラーを与える:

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

私ができる方法はありますリクエスト(例えば、小数点以下を扱うsimplejson)で別のjsonパーサーを使用し、content-typeを依然として指定してください。

+0

"ドキュメントが示唆しているようです":どこですか? –

+0

文字列として保存できませんか? – Kavli

答えて

1

私は別のjsonパーサの使い方はわかりませんが、ヘッダ(とcontent-type)を設定できます。

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

ありがとうございます(ヘッダー(!)に誤字を入れないとできれば)http://stackoverflow.com/questions/16957275/python-to-json-serialization-fails-on-decimal – Yunti

1

小数点はカスタム関数を通すことでシリアル化できます。

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', 
    } 
) 
関連する問題