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

C# 在C中从Json反序列化对象时,如何忽略无效参数#,c#,json,json.net,C#,Json,Json.net,我正在尝试反序列化可能具有无效架构的对象。在这种情况下,我希望所有无效参数都被忽略。我的想法是,我真的不知道json会有什么变化,我希望我的应用程序尽可能长时间地工作。我用以下方式描述了所有课程: [DataContract] public class SampleObject { [DataMember] public InnerObject Inner {get; set; } [DataMember] public bool? Value1 { get;

我正在尝试反序列化可能具有无效架构的对象。在这种情况下,我希望所有无效参数都被忽略。我的想法是,我真的不知道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);
const string JsonObject=@”{
价值12:123,
值1:‘abc’,
价值2:‘abc’,
价值3:‘abc’,
价值4:‘abc’,
内部:{
StringValue:'abc'
}
}";
var a=JsonConvert.DeserializeObject(JsonObject);

反序列化当然会失败,因为“无法将字符串转换为整数:abc.Path'Value3',第5行,位置30。”。但是,我希望反序列化成功,所有无效字段(Value1、Value3和Value4)的值都为null。一个选项是设置一个错误处理程序,忽略反序列化时发生的异常:

var settings = new JsonSerializerSettings
{
    Error = (obj, args) =>
    {
        var context = args.ErrorContext;

        context.Handled = true;        
    }
};

var a = JsonConvert.DeserializeObject<SampleObject>(JsonObject, settings);
var设置=新的JsonSerializerSettings
{
错误=(对象,参数)=>
{
var context=args.ErrorContext;
context.Handled=true;
}
};
var a=JsonConvert.DeserializeObject(JsonObject,设置);

这将所有异常标记为“已处理”,这可能是不明智的。更好的选择可能是检查失败的属性(
context.Member
),以及异常(
context.Error
)类型,以确定这是否是要忽略的异常。

它确实解决了序列化问题,但结果对象为空。它看起来像是为对象调用了一次,然后被中断了。@Darnok:您所说的结果对象为空是什么意思?上述代码中的
a
是否为空?或者所有属性都是空的吗?我有一个结果对象(带有内部对象),但所有值(1、2、3、4、5)都是空的,内部对象的属性(StringValue)也是空的null@Darnok:明白了。对于您发布的示例,它在这里工作:好的,明白了-我没有正确地用[DataMember]属性填充所有字段,因此有效字段根本没有反序列化(因为没有DataMember属性)。现在它的工作性能(感谢您的代码)这里是我的(几乎)工作解决方案: