我试图遍历深度嵌套/混合列表中的每个值,并将任何 Decimal 实例转换为字符串,以便我可以将它们存储在 mongo 中。
我的递归尝试达到了最大深度。我想以迭代或高效的方式解决这个问题。
这似乎不起作用,但这是我最近的尝试:
def convert_decimals(root_obj):
objs_to_convert = [root_obj]
while objs_to_convert:
obj = objs_to_convert.pop(0)
for k, v in enumerate(obj):
if len(v):
objs_to_convert.append(v)
elif isinstance(v, Decimal):
obj[k] = str(v)
示例输入:
[
{
'Payments': {
'Payment': Decimal('495.64'),
'IsCapped': True,
'OtherFees': Decimal('0'),
'CapCostTotal': Decimal('27900'),
'Name': 'TestData',
'Program': {
'ProgramName': u'AST',
'Description': None
},
'Rate': Decimal('0.0254'),
'APR': Decimal('2.54'),
'AppliedIds': [
],
'Tax': Decimal('0')
}
}
]
转换后,十进制实例应该是字符串
最佳答案
在 json.dump()
期间使用 default
参数转换 Decimal
:
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)
就地修改数据
:
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"
}
}
]
如果您使用 generic get_items()
function,您可以简化 convert_decimal()
:
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)
关于python - 在深度嵌套和不可预测的列表中将 python 十进制转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22080079/