MongoDB BSON (драйвер C #), как десериализовать объект BSON, сериализованный с помощью BsonDocument.ToJson ()? - PullRequest
0 голосов
/ 02 октября 2018

Я с трудом пытаюсь десериализовать JSON, созданный с помощью BsonDocument.ToJson (), обратно в BsonDocument.У меня есть сервер ASP.NET Core API и интерфейс Unity C #.Я использую одну и ту же версию BSON в обоих проектах.Серверная часть извлекает объект из MongoDB, сериализует его в JSON, просто вызывая метод ToJson () в полученном документе, и отправляет его клиенту.Вот точный текст вывода этого действия (это тестовый проект, поэтому я не боюсь что-либо раскрывать)

"{\" _ id \ ": ObjectId (\" 5bb35fa04ba8ab26287b52ec \"), \" email \ ": \" some@yandex.ru \ ", \" password \ ": \" 6fa2da5e421daa8cbba5fdb76c88b30b \ ", \" regDate \ ": ISODate (\" 2018-10-02T12: 08: 00.523Z \ "), \" приглашения \ ": [], \" certs \ ": [], \" isAdvertizer \ ": false, \" name \ ": \" \ ", \" usedEmail \ ": \"some@yandex.ru \ ", \" фамилия \ ": \" \ ", \" usedEmails \ ": [\" some@yandex.ru \ "], \" inviter \ ": ObjectId (\" 000000000000000000000000 \ "), \ "accountActivationKey \": \ "65D86D12 \", \ "subscription \": {\ "_ id \": ObjectId (\ "5bb35fa04ba8ab26287b52ed \"), \ "uniqueCode \": \ "9d19297c8 \", \ "userId \ ": ObjectId (\" 5bb35fa04ba8ab26287b52ec \ "), \" isDemo \ ": true, \" expirationDate \ ": \" 07.10.2018 19: 08 \ ", \" expirationUt \ ": NumberLong (1538939280), \"startDate \": \ "02.10.2018 19: 08 \", \ "startUt \": NumberLong (1538482080)}, \ "logs \": \ "02.10.2018 19:08: Получение пробнойодписки: 9d19297c8.Подписка истекает: 07.10.2018 19: 08 \ n \ ", \" sessionKey \ ": \" e8c0c26301bdabbcff79e1407e333d16 \ "}"

Я полностью уверен, что на стороне клиента все как есть,ничего не потеряноЗатем я пытаюсь десериализовать его следующим образом:

var bson = BsonDocument.Parse(jsonString);

И постоянно получать это исключение

System.FormatException: Невозможно десериализовать «BsonDocument» из BsonType «String».в MongoDB.Bson.Serialization.Serializers.SerializerBase 1[TValue].EnsureBsonTypeEquals (MongoDB.Bson.IO.IBsonReader reader, MongoDB.Bson.BsonType bsonType) [0x00015] in <ca055f3819fb41d78b1423b49b25b04b>:0 at MongoDB.Bson.Serialization.Serializers.BsonValueSerializerBase 1 [TBsonValue] .Deserialize (MongoDB.Bson.Serialization.BsonDeserializationContext контекст, MongoDB.Bson.Serialization.BsonDeserializationArgs args) [0x00025] в: 0 в MongoDerializationB.IBsonSerializerExtensions.) [0x00014] в: 0 в Data.LocalData.SetUserData (System.String jsonString) [0x00005] в F: \ UnityProjects \ Wagon \ Assets \ Scripts \ Data \ LocalData.cs: 76

Это немного странно, потому что он не может десериализовать свой собственный Json.Любые предложения?


Добавлено позже

Ну, похоже, ASP-сервер добавляет что-то в строку (я полагаю, проблема с escape-слешами), потому что это хорошо работает на стороне сервера:

var result = user.ToJson();
var bson = BsonDocument.Parse(result);
WriteLine(bson); // output here is as expected

Подробнее

Проблема в 2 двойных кавычках в начале и конце строки после того, как она получена из серверной части ASP enter image description here

Я не знаю, как избежать этого поведения, поэтому сейчас я только использовал этот костыль, чтобы решить его

jsonString = jsonString.Substring(1, jsonString.Length - 2);

Не очень элегантное решение, поэтому я не ставлюэто как ответ, но работает

...