매개 변수를 사용 Decimal
하는 동안 변환하려면 :json.dump()
default
import json
import sys
from decimal import Decimal
def default(obj):
if isinstance(obj, Decimal):
return str(obj)
else:
raise TypeError(obj)
# convert during dump
json.dump(data, sys.stdout, indent=2, default=default)
data
내부 수정하기 :
import json
import sys
from collections import MutableMapping, MutableSequence
from decimal import Decimal
def convert_decimal(json_data):
stack = [json_data]
while stack:
json_data = stack.pop()
if isinstance(json_data, MutableMapping): # json object
it = json_data.items()
elif isinstance(json_data, MutableSequence): # json array
it = enumerate(json_data)
else: # scalar data
continue
for k, v in it:
if isinstance(v, Decimal):
json_data[k] = str(v)
else:
stack.append(v)
# convert inplace
convert_decimal(data)
json.dump(data, sys.stdout, indent=2)
두 스크립트 모두 동일한 출력을 생성합니다.
[
{
"Payments": {
"OtherFees": "0",
"APR": "2.54",
"Rate": "0.0254",
"IsCapped": true,
"Name": "TestData",
"Program": {
"Description": null,
"ProgramName": "AST"
},
"AppliedIds": [],
"CapCostTotal": "27900",
"Tax": "0",
"Payment": "495.64"
}
}
]
일반 함수convert_decimal()
를 사용하면 단순화 할 수 있습니다 .get_items()
def convert_decimal(json_data):
stack = [json_data]
while stack:
json_data = stack.pop()
for k, v in get_items(json_data):
if isinstance(v, Decimal):
json_data[k] = str(v)
else:
stack.append(v)
-------------------십진수를 문자열로 변환하고 싶지만 목록의 내용과 사전의 값에 함수를 재귀 적으로 적용하고 그렇지 않으면 변경되지 않은 객체를 반환합니까? 그런 다음 다음을 수행하십시오.
def strip_decimals(o):
if type(o) == Decimal:
return str(o)
elif type(o) == list:
return map(strip_decimals, o)
elif type(o) == dict:
return dict([(k, strip_decimals(v)) for k, v in o.iteritems()])
else:
return o
결과 :
[{'Payments': {'APR': '2.54',
'AppliedIds': [],
'CapCostTotal': '27900',
'IsCapped': True,
'Name': 'TestData',
'OtherFees': '0',
'Payment': '495.64',
'Program': {'Description': None, 'ProgramName': u'AST'},
'Rate': '0.0254',
'Tax': '0'}}]
출처
https://stackoverflow.com/questions/22080079