- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个要求,我需要一个属性,该属性实际上是来自 MongoDB 集合的 JSON 值,需要反序列化为字符串。此转换引发“无法从 BsonType 'Document' 反序列化 'String'”异常。
我尝试实现一个 JSON 自定义转换器,但由于该值被视为 BsonDocument,它没有帮助,我得到了同样的异常。我还需要原始格式,因为我需要将其转换回 BsonDocument 中。我想我需要一个自定义的 Bson 序列化器/反序列化器。
来自 MongoDB 集合的传入示例文档:
{
"name": "Jane Doe",
"dob": {
"month": "Sep",
"day": 09,
"year": 1987
}
}
public class Person
{
public string name { get; set; }
public Dob dob { get; set; }
public class Dob
{
public string month { get; set; }
public int day { get; set; }
public int year { get; set; }
}
}
public class Person
{
public string name { get; set; }
public string dob { get; set; }
}
最佳答案
总而言之,您的模型上有一个面向公众的 string
属性,其中包含 JSON,您希望通过将 JSON 字符串反序列化为某个中间 DTO 来内部序列化到 MongoDB,然后将 DTO 本身序列化到 Mongo。
以下是解决您的问题的几种方法。
首先 ,您可以将私有(private) DTO 值属性 Dob SerializedDOB { get; set; }
引入数据模型中,用 [BsonElement("dob")]
标记该属性以强制其被序列化,然后将 dob
修改为非序列化代理属性,该代理属性从底层 SerializedDOB
序列化到底层 SerializerBase<string>
在它的 getter 和 setter 中。以下代码显示了这种方法:
public class Person
{
public string name { get; set; }
[BsonIgnore]
public string dob
{
get => BsonExtensionMethods.ToJson(SerializedDOB);
set => SerializedDOB = MyBsonExtensionMethods.FromJson<Dob>(value);
}
[BsonElement("dob")]
Dob SerializedDOB { get; set; }
class Dob // The DTO
{
public string month { get; set; }
public int day { get; set; }
public int year { get; set; }
}
}
dob
创建自定义
Dob
,在(反)序列化期间将字符串值映射到 DTO
JsonStringAsObjectSerializer<TObject>
和从 DTO
BsonExtensionMethods
映射。以下代码显示了这种方法:
public class Person
{
public string name { get; set; }
[BsonSerializer(typeof(JsonStringAsObjectSerializer<Dob>))]
public string dob { get; set; }
class Dob // The DTO
{
public string month { get; set; }
public int day { get; set; }
public int year { get; set; }
}
}
public class JsonStringAsObjectSerializer<TObject> : SerializerBase<string> where TObject : class
{
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, string value)
{
if (value == null)
{
var bsonWriter = context.Writer;
bsonWriter.WriteNull();
}
else
{
var obj = MyBsonExtensionMethods.FromJson<TObject>(value);
var serializer = BsonSerializer.LookupSerializer(typeof(TObject));
serializer.Serialize(context, obj);
}
}
public override string Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var bsonReader = context.Reader;
var serializer = BsonSerializer.LookupSerializer(typeof(TObject));
var obj = (TObject)serializer.Deserialize(context);
return (obj == null ? null : BsonExtensionMethods.ToJson(obj));
}
}
ToJson()
。
FromJson()
有一个
ojit_code 方法但没有 ojit_code 方法:
public static partial class MyBsonExtensionMethods
{
// Not sure why but BsonExtensionMethods.cs seems to lack methods for deserializing from JSON, so I added some here.
// See https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Bson/BsonExtensionMethods.cs
public static TNominalType FromJson<TNominalType>(
string json,
JsonReaderSettings readerSettings = null,
IBsonSerializer<TNominalType> serializer = null,
Action<BsonDeserializationContext.Builder> configurator = null)
{
return (TNominalType)FromJson(json, typeof(TNominalType), readerSettings, serializer, configurator);
}
public static object FromJson(
string json,
Type nominalType,
JsonReaderSettings readerSettings = null,
IBsonSerializer serializer = null,
Action<BsonDeserializationContext.Builder> configurator = null)
{
if (nominalType == null || json == null)
throw new ArgumentNullException();
serializer = serializer ?? BsonSerializer.LookupSerializer(nominalType);
if (serializer.ValueType != nominalType)
throw new ArgumentException(string.Format("serializer.ValueType {0} != nominalType {1}.", serializer.GetType().FullName, nominalType.FullName), "serializer");
using (var textReader = new StringReader(json))
using (var reader = new JsonReader(textReader, readerSettings ?? JsonReaderSettings.Defaults))
{
var context = BsonDeserializationContext.CreateRoot(reader, configurator);
return serializer.Deserialize(context);
}
}
}
关于c# - 从 BsonDocument 反序列化为字符串并序列化回 BsonDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59441376/
我有一个要求,我需要一个属性,该属性实际上是来自 MongoDB 集合的 JSON 值,需要反序列化为字符串。此转换引发“无法从 BsonType 'Document' 反序列化 'String'”异
如何使用官方的c#驱动创建如下文档? { "name": "John Doe", "classess": [ { "classname": "C
我觉得这是可能的,但我似乎找不到。我想配置我的 mongo 驱动程序以将任何 DateTime 对象存储为 BsonDocument。 mongo c# 驱动程序允许您在全局范围内设置某些约定,这样您
我有一个 BsonDocument var document = { "$match" : { "resume.Id" : ObjectId("5450e7c7d7c1820
我正在尝试为 IMongoCollection 编写代理类这样我就可以为一些方法实现使用内存缓存。然而,问题是几乎所有的过滤器都是 FilterDefinition 类型。这意味着我们可以调用Rend
我有一个 JSON 格式的字符串,我想将其转换为 BSONDocument 以便插入到 LiteDB 数据库中。我如何进行转换?我正在使用 LiteDB 5.0.0-beta(我还在 LiteDB v
我对应用程序中 BSONDocuments 处理可选值的方式有困难。我从 Typesafe activator (play/reactivemongo/angular) 的“最终”模板开始。我创建了一
这是我从 MongoDb 集合中提取的 BsonDocument。我想将其反序列化(或映射)到我在 C# 中创建的对象/类。 { "_id" : ObjectId("5699715218a3231
我正在尝试使用 C# 驱动程序在 mongodb 文档中添加字段。 我正在创建文档。 BsonDocument document = new BsonDocument(); 并添加 document.
从服务器获取 BsonDocument 对象后,如何将其反序列化回类? QueryDocument _document = new QueryDocument("key", "value"); Mon
我有一个 JSON 格式的长字符串,我想将其转换为 BSONDocument 以插入到 MongoDB 数据库中。我该如何进行转换?我正在使用官方的 C# 驱动程序。 最佳答案 答案是: string
我正在尝试将带有 LUUID(或本示例中的 NUUID)的过滤器反序列化为 BsonDocument: var tmpQry = "{'ValueId': NUUID('ca7ac84f-18bf-4
我是 scala 新手,我正在尝试创建自定义 BsonDocument。据我在文档 here 中读到,有一个方法 append(String key, BsonValue value) 在内部调用 p
好吧,我正在尝试执行插入批处理操作。为此,我正在创建一个 BsonDocuemt 数组。对于数组中的每个 BsonDocument,我都添加了 BsonElements。 问题类(模型): publi
public class Foo { public ObjectId _id { get; set; } public BsonDocument properties { get; set;
用c#编写的mongodb文档classes是否应该继承BsonDocument? 例如: /// /// Company document /// public class CompanyDoc
我正在 ASP.NET MVC 4 中开发 API,我使用 MongoDB 作为后端。 由于 MongoDB 存储和返回 BSON 对象,而 MVC4 返回 JSON 对象,我认为在其余调用中简单地返
所以我有一个 BsonDocument b(假设它有 FirstName、LastName、Age),您可以通过 b["FirstName"] 等方式访问它... 如果我尝试执行 b["asdfasd
我对 MongoDB 比较陌生。我有一个具有以下定义的对象 [BsonDiscriminator("user")] public Class BrdUser { [BsonId(IdGener
如何将整个 MongoDB BsonDocument 转换为字符串? (我用的是官方的C#驱动) 最佳答案 您可以使用 MongoDB.Bson.BsonExtensionMethods.ToJson
我是一名优秀的程序员,十分优秀!