C# NullValueHandling.Ignore with JsonConverter::WriteJson
我正在尝试执行自定义序列化,所有的happy path代码都可以工作,但是空值路径的行为并不像我希望的那样 我已将序列化程序设置设置为C# NullValueHandling.Ignore with JsonConverter::WriteJson,c#,json,json.net,C#,Json,Json.net,我正在尝试执行自定义序列化,所有的happy path代码都可以工作,但是空值路径的行为并不像我希望的那样 我已将序列化程序设置设置为NullValueHandling。忽略和我的对象图中的其他空部分(不使用自定义序列化)已删除空值。看起来Newtonsoft序列化程序会写入字符串生成器,因此我们应该能够“倒带”任何已写入的json标记,但我不知道如何不写入任何内容 不执行任何操作而只是返回将导致序列化程序抛出异常,因为json将无效 有什么线索吗 public class SpecialCon
NullValueHandling。忽略
和我的对象图中的其他空部分(不使用自定义序列化)已删除空值。看起来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
}
用于对象引用。在您的示例中,您的值是一个整数。要使用默认值忽略整数属性,请使用设置
null
签入WriteJson()
应该不是必需的,因为Json.NET从不使用null值调用转换器。相反,它写入名称&null值本身——如果NullValueHandling==NullValueHandling.Ignore
,则不写入。因此,永远不需要检查空值和倒带
如果某个转换器将对象属性的空值显式写入,则当空值处理或默认值处理为Ignore
时,仍可能写入该对象属性的空值。为了防止出现这种情况,可以检查设置并跳过空值,如下所示:
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; }
}
我无法重现这个问题。1)
NullValueHandling
用于对象引用。因为您的属性是一个整数,所以您可能需要。2) 如果该值为null,则不会调用JsonConverter.WriteJson()
,而Json.NET本身会写入null名称和值。可能您有一些更高级别的转换器无法检查序列化程序。NullValueHandling?请参阅,以获取可能错误的示例。此外,还可以直接序列化到流,例如,a,对于该流,不需要倒带possible@dbc干得好,不知道我怎么错过了。漫长的一天等。空检查可能是从当它是一个可空枚举,或缺乏信任的序列化程序。调用使用value作为默认(零)值,而不是null。我看到的空值是我的,我(错误地)写了出来。稍后我将更详细地阅读dotnetfiddle。谢谢(如果您想要积分,请添加作为答案)