JSON字符串反序列化成对象_部分属性值反序列化失败
简介:本人在开发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); string a = {"name":"lxh","age":27,"other":[{"weight":65,"home":"henan"}]}; //获取JSON对象--Array属性值中的对象的属性值 int weight = JsonConvert.DeserializeObject<JObject>(a)[other"].Value<JArray>()[0][weight"].Value<int>(); 获取JSON对象--属性值 string name = JsonConvert.DeserializeObject<JObject>(a)[namestring>(); ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – Telerik MVC Chart ClientEvents.OnDataBin
- asp.net – 在jQuery对话框中的窗体中,MVC中通常采用的方法
- ASP.NET webforms中的模型Binder
- Asp.net实现MVC处理文件的上传下载功能实例教程
- asp.net-mvc – 在Tag Helper上拥有ViewContext属性的目的是
- asp.net-mvc – ASP.NET MVC下拉列表
- asp.net – 我可以隐藏/显示asp:菜单项基于角色吗?
- 逐步更新asp.net网站?
- asp.net-core – visual studio 2015没有看到我的xunit测试
- asp.net-mvc-4 – 如何在ASP.NET MVC 4中从数据库填充下拉列
- .net – UpdatePanel中的FileUpload控件,不刷新整
- asp.net-mvc-3 – 使用接口作为部分视图数据注释
- asp.net-mvc-3 – MVC 3 – Html.EditorFor似乎缓
- C# 快速高效率复制对象另一种方式 表达式树
- JSON在ASP.NET中使用方法
- asp.net – 是否有一个简单的方法来呈现具有Micr
- asp.net-core – Stream的意外结束,内容可能已被
- asp.net-mvc – 在ASP.NET MVC 3中等效的Flash
- asp.net-mvc – 在ASP.NET MVC 4中的用户控制等效
- ASP。net下ispostback的用法