我正在尝试反序列化可能包含无效架构的对象。在这种情况下,我希望忽略所有无效参数。我的想法是,我真的不知道json会有什么变化,我希望我的应用尽可能长时间工作。我所有的课程都以下列方式描述:
[DataContract]
public class SampleObject
{
[DataMember]
public InnerObject Inner {get; set; }
[DataMember]
public bool? Value1 { get; set; }
[DataMember]
public string Value2 { get; set; }
[DataMember]
public int? Value3 { get; set; }
[DataMember]
public double? Value4 { get; set; }
[DataMember]
public string Value5 { get; set; }
[DataContract]
public class InnerObject
{
[DataMember]
public string StringValue { get; set; }
}
}
反序列化逻辑:
const string JsonObject = @"{
Value12: 123,
Value1: 'abc',
Value2: 'abc',
Value3: 'abc',
Value4: 'abc',
Inner: {
StringValue: 'abc'
}
}";
var a = JsonConvert.DeserializeObject<OuterObject>(JsonObject);
反序列化当然失败了,因为&#34;无法将字符串转换为整数:abc。路径&#39; Value3&#39;,第5行,第30位。&#34;。但是我希望反序列化能够成功使用所有无效字段(Value1,Value3和Value4)的值为null
答案 0 :(得分:1)
一种选择是设置一个错误处理程序,忽略反序列化时出现的异常:
var settings = new JsonSerializerSettings
{
Error = (obj, args) =>
{
var context = args.ErrorContext;
context.Handled = true;
}
};
var a = JsonConvert.DeserializeObject<SampleObject>(JsonObject, settings);
这将所有例外标记为“已处理”,这可能是不明智的。更好的选择可能是检查失败的属性(context.Member
)以及异常(context.Error
)类型,以确定这是否是您想要忽略的异常。