Точно. $oid
или что-либо с префиксом $
является внутренним форматом и зарезервировано, поэтому вы не можете публиковать имена полей. Соглашение взято из MongoDB Extended JSON , где такие префиксы используются для идентификации типа BSON для правильного преобразования и используются в качестве сериализуемого транспорта, поскольку эти "типы" не поддерживаются в базовом JSON.
Таким образом, решение состоит в том, чтобы фактически использовать bson.json_util
для "десериализации" строки JSON с самого начала:
from bson import json_util
# serializedsubject = json.loads(json_util.dumps(subject))
serializedsubject = json_util.loads(request.body) # correct usage
Или более кратко самодостаточно:
input = '{ "skillName" : "Professional Skills" ,"_id" : { "$oid": "5adf23946ab671bf6cb36aff"} }'
json_util.loads(input)
Возвращает
{u'skillName': u'Professional Skills', u'_id': ObjectId('5adf23946ab671bf6cb36aff')}
Это корректно преобразует объекты из любых ключей, помеченных расширенным синтаксисом JSON, в их правильный тип BSON, что также поддерживается в функциях драйвера. И, естественно, драйвер будет преобразован обратно в BSON при отправке в MongoDB.
Если по какой-то причине ваш request.body
содержит что-то кроме «строки», которая является допустимой для ввода в функцию, то ваш код должен преобразовать ее в эту точку. Но не должно быть необходимости "анализировать в JSON", а затем снова "stringify" только для ввода в функцию.
ПРИМЕЧАНИЕ : Если вы еще не сделали этого на клиентской стороне JavaScript приложения, доступен также пакет bson
. Это позволило бы, где такой расширенный JSON «получен» от сервера, преобразовать в типы BSON как объекты JavaScript и, конечно, затем сериализовать такие объекты обратно в расширенный формат JSON.
Это на самом деле было бы рекомендовано, когда необходимо поддерживать информацию «типа» вместе с данными, передаваемыми и хранящимися между клиентом и сервером.