C# MongoDB驱动程序 - 在反序列化时忽略字段

3
我想要获取Booking collection的列表。
一些集合具有以下情况:
情况1
 "Countries": [{
                "Destinations": [{
                    "Code": "CHX",
                    "Name": "French Alps"
                }],
                "Code": {
                    "_t": "JsonElement"
                },
                "Name": {
                    "_t": "JsonElement"
                }
            }]

其中有些人具备以下情况:

案例2

 "Countries": [{
                "Destinations": [{
                    "Code": "DXB",
                    "Name": "Dubai"
                }],
                "Code": "AE",
                "Name": "United Arab Emirates"
            }]

请注意codename字段。
检索列表的模型为:
    {
        public List<DestinationDocument> Destinations { get; set; } = new List<DestinationDocument>();

        public string Code { get; set; }

        public string Name { get; set; }
    }

codename不是字符串时,我希望忽略它们(即,我想忽略情况1中的codename,但不包括情况1中的Destinations)。

使用mongoDb驱动程序,我该如何实现呢?

我尝试了SetIgnoreExtraElements,但它没有起作用。

1个回答

1
控制MongoDB .NET反序列化数据的最简单方法可能是创建自己的序列化程序,并在遇到与BsonType.String不同的任何内容时返回null。这可以分为两个步骤完成。定义您自己的自定义反序列化逻辑:
public class IgnoreDocumentSerializer : SerializerBase<string>
{
    public override string Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    {
        var serializer = BsonSerializer.LookupSerializer(typeof(string));
        if(context.Reader.CurrentBsonType == BsonType.String)
        {
            return (string)serializer.Deserialize(context, args);
        }

        if (context.Reader.CurrentBsonType == BsonType.Document)
        {
            context.Reader.ReadRawBsonDocument();
        }

        return null;
    }
}

并使用BsonSerializer属性装饰您的模型属性:

public class Country
{
    public List<DestinationDocument> Destinations { get; set; } = new List<DestinationDocument>();

    [BsonSerializer(typeof(IgnoreDocumentSerializer))]
    public string Code { get; set; }

    [BsonSerializer(typeof(IgnoreDocumentSerializer))]
    public string Name { get; set; }
}

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