JSON反序列化,错误:值类型为null,如何知道导致错误的确切属性?

ano*_*oop 3 .net c# javascriptserializer json-deserialization

在我的C#代码中,我试图反序列化具有100多个属性(复杂,原始,派生的)的JSON,但出现错误Cannot convert null to a value type.

尽管我最终通过手动故障排除知道了哪个属性导致了问题。

但是,有什么方法可以让我简单地知道JSON或Result_TYPE property or properties(一次完成),从而导致此问题?

我尝试调查detail windowException,但我只能知道datatype。就我而言,它null试图转换为boolean。,但找不到属性名称。

例如:我的JSON

  {
      "customerData": 
      {
        //... other json data

        "someClass":{
            "someClassProp1":"prop1Value",
            "someClassProp2":"prop2Value"
           },
        "isExistData":null,
        "someOtherClass":null

        //... some other json data
      }
  }
Run Code Online (Sandbox Code Playgroud)

并且Result_TYPE为:

Public class CustomerData
{
    // Other properties

    public SomeClass someClass:
    public bool isExistData;    
    public SomeOtherClass someOtherClass:

    // some Other properties
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 JavaScriptSerializer().Deserialize<T>(jsonString);

在上面的示例中:我将如何知道该属性isExistData将导致反序列化错误,因为属性类型为boolean,传入数据为null。[当然除了手动调试,因为可能有100多个属性]

任何人,如果知道找到确切财产的更好方法?

Paw*_*cki 5

如果您不介意使用其他序列化程序,则只需使用JSON .NET,当反序列化时发生错误时,它允许您运行自定义代码:

var errors = new List<string>();
var data = JsonConvert.DeserializeObject<CustomerData>(jsonString,
    new JsonSerializerSettings
    {
        NullValueHandling = NullValueHandling.Include,
        Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs earg)
         {
             errors.Add(earg.ErrorContext.Member.ToString());
             earg.ErrorContext.Handled = true;
         }
    });
Run Code Online (Sandbox Code Playgroud)

错误时,您将拥有所有有问题的属性。当然,默认情况下,JSON .NET默认不会在null属性上失败,这就是为什么我设置了JsonSerializerSettings的NullValueHandling属性的原因。您可以在文档中阅读更多信息:http : //www.newtonsoft.com/json/help/html/SerializationErrorHandling.htm

如果出于某种原因必须使用JavaScriptSerializer,则只需将您的对象反序列化为动态对象(将JSON反序列化为C#动态对象?),然后检查值类型的任何属性是否不具有空值:

foreach (var property in typeof(CustomerData).GetProperties().Where(p => p.PropertyType.IsValueType))
{
    if (dynamicsData[property.Name] == null)
    {
        Console.WriteLine($"This is problematic property: {property.Name}");
    }
}
Run Code Online (Sandbox Code Playgroud)