你可以检测一个你反序列化的对象是否缺lessJson.NET中的JsonConvert类的字段

我试图使用Json.NET反序列化一些Json对象。 我发现但是,当我反序列化一个没有属性的对象时,我正在寻找没有错误,但是当我访问它们时,属性返回一个默认值。 我能够检测何时反序列化错误types的对象是很重要的。 示例代码:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; namespace Json_Fail_Test { class Program { [JsonObject(MemberSerialization.OptOut)] private class MyJsonObjView { [JsonProperty("MyJsonInt")] public int MyJsonInt { get; set; } } const string correctData = @" { 'MyJsonInt': 42 }"; const string wrongData = @" { 'SomeOtherProperty': 'fbe8c20b' }"; static void Main(string[] args) { var goodObj = JsonConvert.DeserializeObject<MyJsonObjView>(correctData); System.Console.Out.WriteLine(goodObj.MyJsonInt.ToString()); var badObj = JsonConvert.DeserializeObject<MyJsonObjView>(wrongData); System.Console.Out.WriteLine(badObj.MyJsonInt.ToString()); } } } 

该程序的输出是:42 0

我宁愿抛出一个例外,以失败告终。 有没有一种方法来检测序列化是否无法find一个参数?

我知道我可以使用Json对象parsing数据,然后使用键值查找来检查参数,但是我使用的代码库使用上面的模式,如果可能的话我会保持一致。

Json.Net序列化程序有一个MissingMemberHandling设置,您可以设置为Error 。 (默认值为Ignore 。)这将导致序列化JsonSerializationException在反序列化过程中抛出JsonSerializationException ,只要遇到目标类中没有相应属性的JSON属性。

 static void Main(string[] args) { try { JsonSerializerSettings settings = new JsonSerializerSettings(); settings.MissingMemberHandling = MissingMemberHandling.Error; var goodObj = JsonConvert.DeserializeObject<MyJsonObjView>(correctData, settings); System.Console.Out.WriteLine(goodObj.MyJsonInt.ToString()); var badObj = JsonConvert.DeserializeObject<MyJsonObjView>(wrongData, settings); System.Console.Out.WriteLine(badObj.MyJsonInt.ToString()); } catch (Exception ex) { Console.WriteLine(ex.GetType().Name + ": " + ex.Message); } } 

结果:

 42 JsonSerializationException: Could not find member 'SomeOtherProperty' on object of type 'MyJsonObjView'. Path 'SomeOtherProperty', line 3, position 33. 

只需将[JsonProperty(Required = Required.Always)]到所需的属性中,如果在反序列化时该属性不在那里,则会引发exception。

 [JsonProperty(Required = Required.Always)] public int MyJsonInt { get; set; } 

将下列属性放在所需的属性上:

 [DataMember(IsRequired = true)] 

如果该成员不存在,则会抛出Newtonsoft.Json.JsonSerializationException。

正如Brian在下面所build议的那样,你的class级也需要这个属性:

 [DataContract]