Похоже, вы распечатали дикт, а не строку.Если это так, то вы определенно не хотите преобразовывать его в его строковое представление, а затем пытаться преобразовать это строковое представление в строку JSON.Вы просто хотите закодировать dict непосредственно в JSON.
Единственный очевидный хитрый бит - это преобразование значений Decimal
в то, что JSON может обработать.Вы должны решить, что вы хотите - возможно, просто конвертировать в float
, возможно конвертировать в float
, но также убедиться, что вы не теряете никакой точности при этом, возможно конвертировать в строку или, возможно, даже конвертировать в какой-то особый маринадиная вещь, как {'type': 'decimal.Decimal', 'args': ['0E-8']}
.Какой из них вам нужен, полностью зависит от того, как вы планируете использовать JSON позже.
Как только вы определились с тем, что хотите сделать, это довольно легко.Документы для json.Encoder
содержат пример, показывающий, как поддерживать произвольные итераторы путем преобразования их в list
s, что довольно легко адаптировать, скажем, для поддержки Decimal
s путем преобразования их в float
s:
class DecimalEncoder(json.Encoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return float(o)
return super().default(o)
enc = DecimalEncoder()
json_string = enc.encode(big_dict_with_decimals)
Я не проверял ваш диктант и не пробовал тщательно проверять, есть ли другие странные типы.Но если есть, вы обращаетесь с ними так же, как Decimal
.