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>()[]["weight"].Value<int>();
//获取JSON对象--属性值
string name = JsonConvert.DeserializeObject<JObject>(a)["name"].Value<string>();
JSON字符串反序列化成对象_部分属性值反序列化失败的更多相关文章
- ObjC 巧用反射和KVC实现JSON快速反序列化成对象
1.简单的KVC介绍 KVC是一种间接访问对象属性的机制,不直接调用getter 和 setter方法,而使用valueForKey 来替代getter 方法,setValue:forKey来代替se ...
- c#json将字符串反序列化成对象时不新建类的做法
在服务端代码文件中加上struct结构体就能解决 struct LocationInfo { public string LocationID { get; set; } public string ...
- 前台jquery+ajax+json传值,后台处理完后返回json字符串,如何取里面的属性值?(不用springmvc注解)
一.取属性值 前台页面: function select(id){ alert("hfdfhdfh"+id); $.ajax({ url:"selectByid.jsp& ...
- [MVC_Json序列化]Json字符串反序列化成C#对象
上一篇中有Json序列化相关问题得到了解决. 那么结果集为Json串时,如何将Json串转成C#对象呢? 现举例说明: -现有如下字符串数据 string k = "{\"ring ...
- C#将Json字符串反序列化成List对象类集合
摘自:http://blog.csdn.net/cdefg198/article/details/7520398 using System.IO; using System.Web.Script.Se ...
- 将JSON字符串反序列化为指定的.NET对象类型
目录导航: 前言: 方法一.在项目中定义对应的对象参数模型,用于映射反序列化出来的参数(复杂JSON字符串数据推荐使用): 方法二.直接将JSON字符串格式数据反序列化转化为字典数据(简单JSON字符 ...
- js将json字符串转化成json对象的方法
js将json字符串转化成json对象的方法: JSON.parse(jsonObject)
- json字符串转java对象,json中字段名称与对象属性名称不一致
json字符串转java对象,json字段名称与对象属性名称不一致可以在对象属性上添加注解@SerializedName解决
- ajax提交后台自动反序列化成对象
下面是ajax提交的方法,主要用到了$form.serializeArray()将表单序列化成json对象,然后用each处理一下,代码如下: var $form = $('<form>& ...
随机推荐
- SQL server SELECT 语句的基本结构
SELECT select_list [INTO new_table] [FROM table_source] [WHERE search_condition] [GROUP BY GROUP_BY_ ...
- ES 6 proimse &&iterator &&Generator函数 &&async
1.proimse 异步调用function getData(){ let promise =new Promise((resolve,reject)); let xmlHttp =new XMLHt ...
- 用appuploader生成发布证书和描述性文件
本帖最后由 长发飘 于 2017-4-13 12:34 编辑 之前用AppCan平台开发了一个应用,平台可以同时生成安卓版和苹果版,想着也把这应用上架到App Store试试,于是找同学借了个苹果开发 ...
- dx.jar文件问题,有没有同学知道怎么解决呀,这一步没法解决,后面就没办法跟着做了
Java Code 123456789101112 dx.jar文件问题,有没有同学知道怎么解决呀,这一步没法解决 - test] Unknown error: Unable to build: ...
- Hadoop 操作常见问题解决
1. 安全模式下不可操作 提示信息: Hadoop "Cannot create directory .Name node is in safe mode." 解决方法: $ ha ...
- 1.4 The usage of plug-in
Once upon a time, we once thought naively that Android plug-in was intended to add new features or a ...
- CSS怎么在项目里引入自定义字体(@font-face)
前言: 以前我一直用内置的默认字体给文字设置字体,直到一天UI妹纸给了我下面的字体 当时我是蒙蔽的,这个字体的效果如下 默认字体并无该字体,直接设置是没有效果的,这时就需要用到自定义字体了 下面 ...
- [Swift]LeetCode25. k个一组翻转链表 | Reverse Nodes in k-Group
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k ...
- [Swift]LeetCode98. 验证二叉搜索树 | Validate Binary Search Tree
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- [Swift]LeetCode546. 移除盒子 | Remove Boxes
Given several boxes with different colors represented by different positive numbers. You may experie ...