C# 在C中从Json反序列化对象时,如何忽略无效参数#
我正在尝试反序列化可能具有无效架构的对象。在这种情况下,我希望所有无效参数都被忽略。我的想法是,我真的不知道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;
[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属性)。现在它的工作性能(感谢您的代码)这里是我的(几乎)工作解决方案: