让 Json.NET + MongoDB Bson 一起玩得很好
Making Json.NET + MongoDB Bson play nice together
我正在尝试将一些 Json.NET json 序列化与 MongoDB 结合起来。
我有一个类似这样的结构:
public class Master {
...props...
public Detail[] Details {get;set;}
}
public class Detail {
...props...
public dynamic Value {get;set;}
}
在这种情况下,我希望 Detail
的 Value
属性 包含动态 json。没有架构,我只想存储其中的任何内容。
如果我通过例如收到这个结构Asp.NET,值 属性 将被反序列化为 JObject
如果值不是原始值,例如 string
、bool
等。
将其存储到 MongoDB 将导致值 属性 被保存为 JObject
。我只想将其存储为值属性的原始 json 结构。
有多种方法可以从 JObject
到 BsonDocument
。例如var doc = BsonDocument.Parse(jobj.ToString());
。
但在这种情况下,我将不得不遍历我的对象结构并手动执行此操作。
(我的真实结构也比较复杂)
我现在在想可能有更好的方法来处理这个问题?
例如以某种方式将某种转换器附加到值 属性 以便 Mongo 驱动程序知道如何将其转换为正确的 Bson。
我在这里有哪些选择?
我认为它需要以某种方式在 Bson 序列化程序端完成?
是的,您需要显式实现 JObject
和 BsonDocument
类型之间的转换。您可以实现自己的转换器并使用属性来避免遍历您的 C# 类型结构。尝试:
public class Detail
{
[BsonSerializer(typeof(DynamicSerializer))]
public dynamic Value { get; set; }
}
public class DynamicSerializer : SerializerBase<dynamic>
{
public override dynamic Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var myBSONDoc = BsonDocumentSerializer.Instance.Deserialize(context);
return (dynamic)JObject.Parse(context.ToString());
}
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, dynamic value)
{
var bson = MongoDB.Bson.BsonDocument.Parse(value.ToString());
BsonDocumentSerializer.Instance.Serialize(context, args, bson);
}
}
我正在尝试将一些 Json.NET json 序列化与 MongoDB 结合起来。 我有一个类似这样的结构:
public class Master {
...props...
public Detail[] Details {get;set;}
}
public class Detail {
...props...
public dynamic Value {get;set;}
}
在这种情况下,我希望 Detail
的 Value
属性 包含动态 json。没有架构,我只想存储其中的任何内容。
如果我通过例如收到这个结构Asp.NET,值 属性 将被反序列化为 JObject
如果值不是原始值,例如 string
、bool
等。
将其存储到 MongoDB 将导致值 属性 被保存为 JObject
。我只想将其存储为值属性的原始 json 结构。
有多种方法可以从 JObject
到 BsonDocument
。例如var doc = BsonDocument.Parse(jobj.ToString());
。
但在这种情况下,我将不得不遍历我的对象结构并手动执行此操作。
(我的真实结构也比较复杂)
我现在在想可能有更好的方法来处理这个问题? 例如以某种方式将某种转换器附加到值 属性 以便 Mongo 驱动程序知道如何将其转换为正确的 Bson。
我在这里有哪些选择? 我认为它需要以某种方式在 Bson 序列化程序端完成?
是的,您需要显式实现 JObject
和 BsonDocument
类型之间的转换。您可以实现自己的转换器并使用属性来避免遍历您的 C# 类型结构。尝试:
public class Detail
{
[BsonSerializer(typeof(DynamicSerializer))]
public dynamic Value { get; set; }
}
public class DynamicSerializer : SerializerBase<dynamic>
{
public override dynamic Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var myBSONDoc = BsonDocumentSerializer.Instance.Deserialize(context);
return (dynamic)JObject.Parse(context.ToString());
}
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, dynamic value)
{
var bson = MongoDB.Bson.BsonDocument.Parse(value.ToString());
BsonDocumentSerializer.Instance.Serialize(context, args, bson);
}
}