JSON

JSON字符串反序列化成对象

字号+ 作者:H5之家 来源:H5之家 2017-06-11 10:03 我要评论( )

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

简介:本人在开发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);

得到对象如下:

 JSON字符串反序列化成对象_部分属性值反序列化失败

在调试中发现:

((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(); formData = obj.ToObject<InternalRecommendRequestFormModel>();

总结:

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

1 2 下一页

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 阿里巴巴Json工具-Fastjson讲解

    阿里巴巴Json工具-Fastjson讲解

    2017-06-11 10:00

  • 小技巧之JSON.stringify()/parse()

    小技巧之JSON.stringify()/parse()

    2017-06-11 09:07

  • json,第2页

    json,第2页

    2017-06-09 13:01

  • json result

    json result

    2017-06-08 10:00

网友点评
g