我正在尝试执行自定义序列化,所有快乐路径代码都可以工作,但空值路径的行为并不像我想要的那样。
我已将序列化器设置设置为NullValueHandling.Ignore
我的对象图的其他部分为空(并且不使用我的自定义序列化)已删除空值。看起来 Newtonsoft 序列化程序写入字符串生成器,因此我们应该能够“倒带”任何写入的 json 标记,但我不知道如何不写入任何内容。
不执行任何操作而仅返回会导致序列化程序抛出异常,因为 json 无效。
有什么线索吗?
public class SpecialConvertor : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null || (int)value == 0)
{
if (serializer.NullValueHandling == NullValueHandling.Ignore)
{
//how to make this work?
}
else
{
writer.WriteNull();
}
return;
}
// the rest of WriteJson
}
// the rest of SpecialConvertor
}
NullValueHandling http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_NullValueHandling.htm用于对象引用。在您的示例中,您的值是一个整数。要省略具有默认值的整数属性,请使用以下设置DefaultValueHandling = DefaultValueHandling.Ignore http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm.
The null
报到WriteJson()
应该不是必需的,因为 Json.NET 永远不会使用 null 值调用转换器。相反,它会自己写入名称和 null 值——或者不写入,如果NullValueHandling == NullValueHandling.Ignore
。因此永远不需要检查 null 和倒带。
当空值处理或默认值处理被执行时,对象属性的空值仍可能被写入Ignore
如果您的转换器之一将其明确写入WriteJson http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_JsonConverter_WriteJson.htm。为了防止这种情况,您可以检查设置并跳过空值,如下所示:
public class MyClassConverter : JsonConverter
{
const string Prefix = "My Value Is: ";
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var myClass = (MyClass)value;
writer.WriteStartObject();
if (myClass.StringValue != null
|| (serializer.NullValueHandling != NullValueHandling.Ignore
&& (serializer.DefaultValueHandling & DefaultValueHandling.Ignore) != DefaultValueHandling.Ignore))
{
writer.WritePropertyName("StringValue");
if (myClass.StringValue == null)
writer.WriteNull();
else
serializer.Serialize(writer, Prefix + myClass.StringValue);
}
writer.WriteEndObject();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var s = (string)JValue.Load(reader);
if (s.StartsWith(Prefix))
s = s.Substring(Prefix.Length);
return s;
}
public override bool CanConvert(Type objectType) { return objectType == typeof(MyClass); }
}
[JsonConverter(typeof(MyClassConverter))]
public class MyClass
{
public string StringValue { get; set; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)