После попытки вставить_он в коллекцию. Я получаю эту ошибку:
bson.errors.InvalidDocument: cannot encode object: Decimal('0.16020'), of type: <class 'decimal.Decimal'>
Код работает нормально, когда JSON не включает объект decimal.Decimal
. Если есть решение, можете ли вы рассмотреть возможность его рекурсивного кодирования, чтобы сделать весь словарь python json_dic
совместимым для вставки в MongoDB (так как существует более одного экземпляра класса decimal. Decimal в json.dic
записей).
Любая помощь будет оценена!
РЕДАКТИРОВАТЬ 1: Вот json Я имею дело с
import simplejson as json
from pymongo import MongoClient
json_string = '{"A" : {"B" : [{"C" : {"Horz" : 0.181665435,"Vert" : 0.178799435}}]}}'
json_dict = json.loads(json_string)
this_collection.insert_one(json_dict)
Это производит bson.errors.InvalidDocument: cannot encode object: Decimal('0.181665435'), of type: <class 'decimal.Decimal'>
РЕДАКТИРОВАТЬ 2: К сожалению, мой пример, приведенный выше, слишком сильно упростил мою существующую JSON и ответ, предоставленный @ Belly Buster (несмотря на то, что он отлично работал с Json выше) выдает ошибку:
AttributeError: 'decimal.Decimal' object has no attribute 'items'
с моим фактическим Json, поэтому я предоставляю здесь полное Json, надеюсь, чтобы выяснить, что не так (также как снимок экрана ):
json_string =
'
{
"Setting" : {
"GridOptions" : {
"Student" : "HighSchool",
"Lesson" : 1,
"Attended" : true
},
"Grades" : [
80,
50.75
],
"Count" : 2,
"Check" : "Coursework",
"Passed" : true
},
"Slides" : [
{
"Type" : "ABC",
"Duration" : 1.5
},
{
"Type" : "DEF",
"Duration" : 0.5
}
],
"Work" : {
"Class" : [
{
"Time" : 123456789,
"Marks" : {
"A" : 50,
"B" : 100
}
}
],
"CourseWorkDetail" : [
{
"Test" : {
"Mark" : 0.987654321
},
"ReadingDate" : "Feb162006",
"Reading" : 300.001,
"Values" : [
[
0.98765
],
[
-0.98765
]
]
},
{
"Test" : {
"Mark" : 0.123456789
},
"ReadingDate" : "Jan052010",
"Reading" : 200.005,
"Values" : [
[
0.12345
],
[
-0.12345
]
]
}
]
},
"listing" : 5
}
'
Редактировать 3: В дополнение к ответу ниже, вы можете рекурсивно повторять итерацию в словаре, подобном этому, и использовать функцию из ответ
def iterdict(dict_items, debug_out):
for k, v in dict_items.items():
if isinstance(v):
iterdict(v)
else:
dict_items[k] = convert_decimal(v)
return dict_items