微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

属性值反序列化失败怎么解决?

简介:本人在开发webapi接口时遇到了:一个复杂的Json字符串在反序列化为对象时报,无法发序列化其中的一个属性对象?

使用方法

InternalRecommendRequestFormModel formData = Newtonsoft.Json.JsonConvert.DeserializeObject<InternalRecommendRequestFormModel>(dataInput);

其中:InternalRecommendRequestFormModel是一个复杂的对象,属性中又包含其他对象和属性。 dataInput是接口传入的JSON字符串,它是另一个接口返回的InternalRecommendRequestFormModel对象,当然数据在传递的过程中一些属性发生了变化,按理应该可以正常反序列化,但是在使用的时候却在反序列化是报错,无法发序列化其中一个属性

那么我们遇到这种复杂的反序列化成对象时该怎么办?

首先:分析知道,报错是由于个别属性发序列化失败导致,那么只要可以将这部分属性清空或者移除该属性的序列化内容,就可以了。

那么:如何在序列化的JSON字符串移除掉一部分属性呢?

我们首先想到的是,字符串的替换,清空,截取等等,但是想想容易出错。能不能现将这个字符串变成一个可操作的对象(当然不是InternalRecommendRequestFormModel),然后干掉或者清空某个对象后再转换成我们想要的对象? 其实我一开想想到object,不是任意对象都是object吗?

开始尝试:

object formData = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(dataInput);

得到对象如下:

在调试中发现:

((Newtonsoft.Json.Linq.JObject)(JsonConvert.DeserializeObject<object>(dataInput))).ChildrenTokens[46] ,我是可以拿到属性值的。

也就是说,通过上述代码可以看出,反序列化的object对象被转换为了:Newtonsoft.Json.Linq.JObject 对象, 这个对象就是微软给我们提供的JSON对象的一个基类,也就是说,只要你是一个对象,如果被json序列化后,它就可以帮你反序列化回来。

代码改进为:

InternalRecommendRequestFormModel formData = new InternalRecommendRequestFormModel();Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);
obj.Remove(opinions);
formData = obj.ToObject<InternalRecommendRequestFormModel>();

总结:

只要JSON字符串是一个对象,当我们直接反序列化遇到,字符串中的部分属性值不符合要求时,我们可以先将对象转为:JObject,对对象属性修正后,再使用JObject提供的ToObject<T>()再转为需要转换的对象

Newtonsoft.Json.Linq.JObject obj = JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(dataInput);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐