我有几个DAO文件存储在Azure DocumentDb中,现在我希望空值不会存储在DocDb中,可以通过属性的[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
属性来存储。但我不想把这个属性放在每个财产上。
问题是,没有任何方法可以为Azure DocumentDb API使用的Json序列化程序设置JsonSerializerSettings
。
我认为最好的方法是在类上使用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);
}
}
但我得到了WriteJson这样的例外:
类型的第一次机会异常 'Newtonsoft.Json.JsonSerializationException'发生在 Newtonsoft.Json.dll
附加信息:使用类型检测到自引用循环 '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);
}
然后我得到:
类型'System.StackOverflowException'的未处理异常 发生在Newtonsoft.Json.dll
答案 0 :(得分:6)
我通过设置默认的全局设置解决了这个问题:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
};