包含 null 值的 BsonDocument 的 Newtonsoft.Json.JsonConvert.SerializeObject 失败,并出现 InvalidCastException

Newtonsoft.Json.JsonConvert.SerializeObject of BsonDocument containing null value fails with an InvalidCastException

提问人:koan911 提问时间:12/4/2018 最后编辑:koan911 更新时间:1/4/2019 访问量:465

问:

以下测试代码片段演示了当对象值为 null 甚至 BsonNull.Value 时,SerializeObject 中发生的 InvalidCastException。如果该值更改为 42,则序列化工作正常。

    var bson = new BsonDocument
    {
        { "key", null /*BsonNull.Value*/ }
    };
    // the following fails with an inexplicable InvalidCastException...
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(
        bson,
        new JsonSerializerSettings
        {
            NullValueHandling = NullValueHandling.Include
        });
    Console.WriteLine(json);

“使用 MongoDB.Bson”和“使用 Newtonsoft.Json”有效。Json版本为v12.0.1。

请注意,我也考虑过使用 BsonDocument ToJson 方法,但它存在其他问题(处理枚举值),因此我不再将其视为解决方法。

json mongodb null json.net

评论

0赞 Tom 5/24/2019
你是怎么解决这个问题的?我遇到了类似的问题。

答:

0赞 niklr 1/4/2019 #1

作为解决方法,您可以注册自定义约定,如下所示:

ConventionRegistry.Register("IgnoreIfDefault", 
                            new ConventionPack { new IgnoreIfDefaultConvention(true) }, 
                            t => true);

这会在序列化和反序列化时将 [IgnoreIfDefault] 特性隐式应用于所有属性。