Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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# 在json.Net中反序列化json时忽略无效字段_C#_Json_Json.net - Fatal编程技术网

C# 在json.Net中反序列化json时忽略无效字段

C# 在json.Net中反序列化json时忽略无效字段,c#,json,json.net,C#,Json,Json.net,我试图从第三方提供者反序列化一些json,偶尔它会返回一些无效的日期字段,如-0001-01-01或其他什么。这会导致进程抛出异常 有没有办法告诉Json.Net忽略无效的字段 谢谢 MattJSON.NET有许多控制序列化的方法。你可以看一个例子 上的在线文档中有一个完整的主题 您可以编写自定义转换器;有关名称空间,请参阅文档。JSON.NET有许多控制序列化的方法。你可以看一个例子 上的在线文档中有一个完整的主题 您可以编写自定义转换器;请参阅名称空间的文档。要扩展David的答案,我使用了

我试图从第三方提供者反序列化一些json,偶尔它会返回一些无效的日期字段,如-0001-01-01或其他什么。这会导致进程抛出异常

有没有办法告诉Json.Net忽略无效的字段

谢谢


Matt

JSON.NET有许多控制序列化的方法。你可以看一个例子

上的在线文档中有一个完整的主题


您可以编写自定义转换器;有关名称空间,请参阅文档。

JSON.NET有许多控制序列化的方法。你可以看一个例子

上的在线文档中有一个完整的主题


您可以编写自定义转换器;请参阅名称空间的文档。

要扩展David的答案,我使用了一个自定义日期时间转换器:

public class SafeDateTimeConvertor : DateTimeConverterBase
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        DateTime result;
        if (DateTime.TryParse(reader.Value.ToString(), out result))
            return result;
        return existingValue;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((DateTime)value).ToString("yyyy-MM-dd hh:mm:ss"));
    }
}
然后按如下方式应用:

var result = JsonConvert.DeserializeObject<TestClass>(json, new SafeDateTimeConvertor());

为了扩展David的答案,我使用了一个自定义日期时间转换器:

public class SafeDateTimeConvertor : DateTimeConverterBase
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        DateTime result;
        if (DateTime.TryParse(reader.Value.ToString(), out result))
            return result;
        return existingValue;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((DateTime)value).ToString("yyyy-MM-dd hh:mm:ss"));
    }
}
然后按如下方式应用:

var result = JsonConvert.DeserializeObject<TestClass>(json, new SafeDateTimeConvertor());

有时,第三方会忽略JSON中的类型安全性。我建议你联系他们。我有一个场景,其中属性要么是字符串数组,要么是false。Json.NET不喜欢这种情况,因此作为临时黑客,我创建了这个自定义转换器来忽略反序列化异常:

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        try { return JToken.Load(reader).ToObject(objectType); }
        catch { }
        return objectType.IsValueType ? Activator.CreateInstance(objectType) : null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

不建议采用这种转换方法。将您的想法发送给正在使用的原始JSON的设计者后,将其用作临时解决方案。

如果发生这种情况,第三方可能会忽略其JSON中的类型安全性。我建议你联系他们。我有一个场景,其中属性要么是字符串数组,要么是false。Json.NET不喜欢这种情况,因此作为临时黑客,我创建了这个自定义转换器来忽略反序列化异常:

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        try { return JToken.Load(reader).ToObject(objectType); }
        catch { }
        return objectType.IsValueType ? Activator.CreateInstance(objectType) : null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

不建议采用这种转换方法。将您的想法发送给正在使用的原始JSON的设计者后,将其用作临时解决方案。

您可能应该查看无效数据的根本原因,并在尝试解决该问题之前,如有可能,首先修复该数据。该字段似乎设置为DateTime.MinValue。这不一定是无效的。因为DateTime是一种值类型,所以不能为null;如果您想允许这样做,请考虑将值类型字段设置为空。如果不需要,可以使用[XmlIgnore]属性标记属性serialized@auburg,你的意思可能是[JsonIgnore]也许这可以帮助你。这解释了如何管理json.net中的反序列化错误。您可能应该查看无效数据的根本原因,如果可能的话,在尝试解决它之前,首先修复它。看起来此字段设置为DateTime.MinValue。这不一定是无效的。因为DateTime是一种值类型,所以不能为null;如果您想允许这样做,请考虑将值类型字段设置为空。如果不需要,可以使用[XmlIgnore]属性标记属性serialized@auburg,你的意思可能是[JsonIgnore]也许这可以帮助你。这将解释如何管理json.net中的反序列化错误。我认为自定义转换器是可行的,谢谢。我认为自定义转换器是可行的,谢谢。除了显式指定格式,您可以使用DateTimevalue.toStringo-它对应于ISO 8601格式。您还可以使用[JsonConvertertypeofSafeDateTimeConvertor]类似于,您可以使用DateTimevalue.toStringo,而不是显式指定格式-它对应于ISO 8601格式您还可以使用[JsonConvertertypeofSafeDateTimeConvertor]来修饰所需的属性,类似于