通过JsonConverter属性在JSON.NET上设置类的NullValueHandling(对于Azure DocumentDb)

ale*_*zyk 0 c# json azure json.net azure-cosmosdb

我有几个DAO文件,存储在Azure DocumentDb中,现在我希望空值不会存储在DocDb中,可以通过[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]属性属性来存储 .但我不想把这个属性放在每个财产上.

问题是,没有任何方法可以设置JsonSerializerSettingsAzure DocumentDb API使用的Json序列化程序.

对我来说,似乎是使用JsonConverter类的属性,并创建一个自定义JsonConverter类,它将使用标准序列化但更改序列化设置.

这是转换器:

public class CommonJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var token = JObject.ReadFrom(reader);
        return token.ToObject(objectType, serializer);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.NullValueHandling = NullValueHandling.Ignore;
        var jo = JObject.FromObject(value, serializer);
        jo.WriteTo(writer);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到了WriteJson这样的例外:

Newtonsoft.Json.dll发生了'Newtonsoft.Json.JsonSerializationException'类型的第一次机会异常

附加信息:使用"Infrastructure.Dao.Contacts.PersonDao"类型检测到的自引用循环.路径''.

我试图将WriteJson函数更改为:

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var jo = JObject.FromObject(value, new JsonSerializer() { NullValueHandling = NullValueHandling.Ignore });
        jo.WriteTo(writer);
    }
Run Code Online (Sandbox Code Playgroud)

但后来我得到:

Newtonsoft.Json.dll中发生了未处理的"System.StackOverflowException"类型异常

ale*_*zyk 8

我通过设置默认的全局设置解决了它:

    JsonConvert.DefaultSettings = () => new JsonSerializerSettings
    {
        NullValueHandling = NullValueHandling.Ignore
    };
Run Code Online (Sandbox Code Playgroud)