让Json.NET和MongoDB Bson配合得更好

3

我正在尝试将一些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接收到此结构,则如果值不是诸如stringbool等基元,则将反序列化Value属性为JObject。 将其存储到MongoDB中将导致Value属性被保存为JObject。我只想将其存储为值属性的原始JSON结构。
有一些方法可以从JObject转换为BsonDocument。例如var doc = BsonDocument.Parse(jobj.ToString());。 但在这种情况下,我必须遍历我的对象结构并手动执行此操作。 (我的实际结构也更加复杂)
现在我正在考虑可能有更好的方法来处理这个问题? 例如,以某种方式附加一个转换器到值属性,以便Mongo驱动程序知道如何将其转换为适当的Bson。
我在这里有哪些选择? 我认为它需要在Bson序列化程序端完成一些工作?
1个回答

4

是的,您需要显式实现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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接