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