在C#中从Json反序列化对象时,如何忽略无效参数?

时间:2015-06-29 17:48:31

标签: c# json json.net

我正在尝试反序列化可能包含无效架构的对象。在这种情况下,我希望忽略所有无效参数。我的想法是,我真的不知道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

1 个答案:

答案 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)类型,以确定这是否是您想要忽略的异常。