Укажите типы свойств при десериализации Json в BsonDocument - PullRequest
1 голос
/ 06 марта 2019

Я пытаюсь десериализовать неструктурированный объект 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 все. Некоторые свойства (если они существуют) всегда одинаковы, поэтому вместо того, чтобы хранить все на монго в виде строки, я бы с самого начала дал им правильные возможные типы.

...