gpt4 book ai didi

c# - 如何为具有无效值的属性使用 JSON.net 的默认值

转载 作者:太空狗 更新时间:2023-10-30 01:32:58 24 4
gpt4 key购买 nike

我正在使用 Newtonsoft JSON 库反序列化来自 Web 服务的响应。问题是某些字段包含无效的值。例如,一条记录上的一个字段包含一个“T”,代表一个应该是数字的字段。我想做的是让无效字段的值为 null 或其他一些默认值。我的所有属性都定义为可为 null,因此如果它们默认为 null 就可以了。

有没有办法做到这一点?我曾尝试创建自定义 JsonConverter,但我宁愿不必为每种类型定义 JsonConverter。如果可能的话,如果该属性的值无效(如数字类型的“T”),我想将所有字段设置为 null。

我查看了 OnError 事件处理程序,但它似乎会丢弃整个错误记录。我不想丢弃任何记录。我只希望无效属性的值为 null。

这可能吗?我已经查找了很多答案,但没有找到试图这样做的另一个问题,但如果我忽略了现有问题,请告诉我。

感谢您的帮助。

最佳答案

你可以做一个JsonConverter对于所有尝试将相应的 JSON 值反序列化为非 null 的基础类型的可空类型,并在失败时返回 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();
}
}

然后 use it在反序列化您的类(class)时。

var settings = new JsonSerializerSettings { Converters = new[] { new NullableTypeConverter() } };

如果 JSON 本身格式不正确且无法读取,转换器仍会抛出异常(来自对 JToken.Load() 的调用)。如果 JSON 值在加载后无法转换为适当的类型,它只会吞下异常。

关于c# - 如何为具有无效值的属性使用 JSON.net 的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35349414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com