【问题标题】:Making Json.NET + MongoDB Bson play nice together让 Json.NET + MongoDB Bson 一起玩得很好
【发布时间】:2020-04-20 14:49:18
【问题描述】:

我正在尝试将一些 Json.NET json 序列化与 MongoDB 结合起来。 我有一个类似这样的结构:

public class Master {
  ...props...

  public Detail[] Details {get;set;} 
}

public class Detail {
  ...props...

  public dynamic Value {get;set;}
}

在这种情况下,我希望 DetailValue 属性包含动态 json。没有模式,我只想存储那里的任何内容。 如果我通过例如收到这个结构在 Asp.NET 中,如果 Value 属性不是诸如 stringbool 等基本类型的值,则该属性将被反序列化为 JObject。 将其存储到 MongoDB 将导致 Value 属性被保存为 JObject。我只想将其存储为 value 属性的原始 json 结构。

JObjectBsonDocument 有多种方法。例如var doc = BsonDocument.Parse(jobj.ToString());。 但在这种情况下,我将不得不遍历我的对象结构并手动执行此操作。 (我的真实结构也比较复杂)

我现在在想可能有更好的方法来处理这个问题? 例如以某种方式将某种转换器附加到 value 属性,以便 Mongo 驱动程序知道如何将其转换为正确的 Bson。

我在这里有什么选择? 我认为它需要以某种方式在 Bson 序列化程序端完成?

【问题讨论】:

    标签: c# mongodb json.net mongodb-.net-driver


    【解决方案1】:

    是的,您需要显式实现JObjectBsonDocument 类型之间的转换。您可以实现自己的转换器并使用属性来避免遍历您的 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2015-04-30
      • 2011-03-16
      • 2016-11-13
      • 1970-01-01
      • 2014-10-02
      相关资源
      最近更新 更多