Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NullValueHandling.Ignore with JsonConverter::WriteJson_C#_Json_Json.net - Fatal编程技术网

C# NullValueHandling.Ignore with JsonConverter::WriteJson

C# NullValueHandling.Ignore with JsonConverter::WriteJson,c#,json,json.net,C#,Json,Json.net,我正在尝试执行自定义序列化,所有的happy path代码都可以工作,但是空值路径的行为并不像我希望的那样 我已将序列化程序设置设置为NullValueHandling。忽略和我的对象图中的其他空部分(不使用自定义序列化)已删除空值。看起来Newtonsoft序列化程序会写入字符串生成器,因此我们应该能够“倒带”任何已写入的json标记,但我不知道如何不写入任何内容 不执行任何操作而只是返回将导致序列化程序抛出异常,因为json将无效 有什么线索吗 public class SpecialCon

我正在尝试执行自定义序列化,所有的happy path代码都可以工作,但是空值路径的行为并不像我希望的那样

我已将序列化程序设置设置为
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。谢谢(如果您想要积分,请添加作为答案)