我正在使用 Newtonsoft JSON 库来反序列化来自 Web 服务的响应。问题是某些字段包含无效值。例如,一条记录上的一个字段包含一个“T”,表示该字段应该是数字。我想做的是将无效字段的值设置为 null 或其他默认值。我的所有属性都定义为可为空,因此如果它们默认为空就可以了。
有没有办法做到这一点?我尝试过创建自定义 JsonConverter,但我宁愿不必为每种类型定义 JsonConverter。如果可能的话,我想对于所有字段,如果该属性的值无效(例如数字类型的“T”),则将它们设置为 null。
我查看了 OnError 事件处理程序,但这似乎会丢弃错误的整个记录。我不想丢弃任何记录。我只是希望无效属性的值为空。
这可能吗?我已经寻找了很多答案,但没有找到另一个试图做到这一点的问题,但如果我忽略了现有的问题,请告诉我。
感谢您的帮助。
你可以做一个JsonConverter http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonConverter.htm对于所有可空类型,当非空时尝试将相应的 JSON 值反序列化为基础类型,并且失败时返回 null:
public class NullableTypeConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return Nullable.GetUnderlyingType(objectType) != null;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var underlyingType = Nullable.GetUnderlyingType(objectType);
if (underlyingType == null)
throw new JsonSerializationException("Invalid type " + objectType.ToString());
var token = JToken.Load(reader);
try
{
return token.ToObject(underlyingType, serializer);
}
catch (Exception ex)
{
// Log the exception somehow
Debug.WriteLine(ex);
return null;
}
}
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
Then use it http://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm反序列化你的类时。
var settings = new JsonSerializerSettings { Converters = new[] { new NullableTypeConverter() } };
转换器仍然会抛出异常(从调用JToken.Load()
) 如果 JSON 本身格式错误且无法读取。仅当 JSON 值在加载后无法转换为适当的类型时,它才会吞掉异常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)