代码之家  ›  专栏  ›  技术社区  ›  Roger Johansson

制作Json.NET+Mongodbson一起玩得很好

  •  0
  • Roger Johansson  · 技术社区  · 5 年前

    我想把一些Json.NETMongoDB的json序列化。 我有一个类似的结构:

    public class Master {
      ...props...
    
      public Detail[] Details {get;set;} 
    }
    
    public class Detail {
      ...props...
    
      public dynamic Value {get;set;}
    }
    

    在这种情况下,我想要 Value 财产 Detail 包含动态json。没有模式,我只想存储其中的任何内容。 如果我通过例如。Asp.NET,值属性将反序列化为 JObject string bool 等。 将其存储到MongoDB将导致Value属性保存为 作业对象 . 我只想将其存储为value prop的原始json结构。

    我们还有很多路要走 作业对象 BsonDocument . 例如 var doc = BsonDocument.Parse(jobj.ToString()); 但在这种情况下,我必须遍历我的对象结构并手动执行此操作。 (我的真实结构也更复杂)

    我现在在想也许有更好的办法来解决这个问题? e、 以某种方式将某种转换器附加到value属性,以便Mongo驱动程序知道如何将其转换为正确的Bson。

    我有什么选择?

    0 回复  |  直到 5 年前
        1
  •  3
  •   mickl    5 年前

    是的,您需要显式地实现 JObject BsonDocument

    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);
        }
    }