Я пытаюсь десериализовать неструктурированный объект JSON (есть несколько возможностей схемы) в BsonDocument
, и я пытаюсь указать правильные типы для некоторых свойств (которые я знаю заранее).
Скажем, например (очень упрощенный пример):
{ "Id": "039665be-a1a8-4062-97d6-e44fea2affff", "Foo":"Bar", "Baz":30 }
Таким образом, я знаю, что каждый раз, когда я нахожу свойство «Id» (которое может присутствовать или не присутствовать) в корне объекта, оно должно быть преобразовано в тип UUID (двоичный тип bson 4).
Я сделал простого JsonReader
потомка, и я переопределяю ReadBsonType
, и оба возвращаю новое CurrentBsonType
и предоставляем там преобразованное значение, а затем переопределяем все методы для каждого возможного типа (ReadDateTime()
, ReadInt32()
, ReadInt64()
, ReadBinaryData()
и т. Д.) И предоставление проанализированного значения.
Это прекрасно работает (хотя я нахожу это немного неудобным), когда объект JSON прост, но если у него есть вложенные объекты со свойствами с одинаковыми именами (которые я не хочу анализировать), то возникают проблемы.
Я попытался переопределить ReadStartArray()
, ReadStartDocument()
и т. Д. И попытался создать «путь», к которому я могу обратиться, но фактический порядок вызова методов JsonReader
сбивает с толку me (кажется, что проверяется тип перед проверкой имени свойства, поэтому свойство CurrentName
при проверке типа ссылается на предыдущее свойство и т. д.).
Я немного обошел его с помощью очень некрасивого кода ... и я уверен, что должен быть лучший способ сделать это без отображения классов, хотя поиск документации оказывается трудным делом (поскольку Монго часто называет «json» фактическим «расширенным json», поэтому документация смешивается тут и там).
Кто-нибудь когда-нибудь оказывался в такой ситуации?
PS: прежде чем кто-либо спросит, я храню данные, возвращенные в виде строк json со стороннего сервера, в базе данных mongo (которая будет добыта позже), и хотя есть некоторые схемы для доступных типов данных (и я мог бы classmap их), возможно, появятся новые схемы в будущем, поэтому я не могу просто сопоставить classmap все. Некоторые свойства (если они существуют) всегда одинаковы, поэтому вместо того, чтобы хранить все на монго в виде строки, я бы с самого начала дал им правильные возможные типы.