标签:json-deserialization javascriptserializer c net
在我的C#代码中,我试图对具有100多个属性(复杂,原始,派生)的JSON反序列化,并且遇到错误无法将null转换为值类型.
尽管我最终通过手动故障排除知道了哪个属性导致了问题.
但是,有什么方法可以让我简单地知道JSON或Result_TYPE属性或一个或多个属性(一次完成),从而导致此问题?
我尝试查看Exception的详细信息窗口,但我只能知道数据类型.就我而言,尝试转换为布尔值为null.但是找不到属性名称.
例如:我的JSON
{
"customerData":
{
//... other json data
"someClass":{
"someClassProp1":"prop1Value",
"someClassProp2":"prop2Value"
},
"isExistData":null,
"someOtherClass":null
//... some other json data
}
}
并且Result_TYPE为:
Public class CustomerData
{
// Other properties
public SomeClass someClass:
public bool isExistData;
public SomeOtherClass someOtherClass:
// some Other properties
}
I’m using
JavaScriptSerializer().Deserialize<T>(jsonString);
在上面的示例中:我如何知道属性isExistData将导致反序列化错误,因为属性类型为布尔值,而传入数据为null. [当然除了手动调试,因为可能有100多个属性]
任何人都可以提供帮助,如果知道找到确切属性的更好方法?
解决方法:
如果您不介意使用其他序列化程序,则只需使用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;
}
});
错误时,您将拥有所有有问题的属性.当然,默认情况下,JSON .NET默认不会在null属性上失败,这就是为什么我设置了JsonSerializerSettings的NullValueHandling属性的原因.您可以在文档中阅读更多信息:http://www.newtonsoft.com/json/help/html/SerializationErrorHandling.htm
如果出于任何原因必须使用JavaScriptSerializer,则只需将您的对象反序列化为动态对象(Deserialize JSON into C# dynamic object?),然后检查值类型的任何属性是否不具有空值:
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}");
}
}
标签:json-deserialization,javascriptserializer,c,net 来源: https://codeday.me/bug/20191026/1933746.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。