简介:本人在开发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字符串反序列化成对象_部分属性值反序列化失败的更多相关文章

  1. ObjC 巧用反射和KVC实现JSON快速反序列化成对象

    1.简单的KVC介绍 KVC是一种间接访问对象属性的机制,不直接调用getter 和 setter方法,而使用valueForKey 来替代getter 方法,setValue:forKey来代替se ...

  2. c#json将字符串反序列化成对象时不新建类的做法

    在服务端代码文件中加上struct结构体就能解决 struct LocationInfo { public string LocationID { get; set; } public string ...

  3. 前台jquery+ajax+json传值,后台处理完后返回json字符串,如何取里面的属性值?(不用springmvc注解)

    一.取属性值 前台页面: function select(id){ alert("hfdfhdfh"+id); $.ajax({ url:"selectByid.jsp& ...

  4. [MVC_Json序列化]Json字符串反序列化成C#对象

    上一篇中有Json序列化相关问题得到了解决. 那么结果集为Json串时,如何将Json串转成C#对象呢? 现举例说明: -现有如下字符串数据 string k = "{\"ring ...

  5. C#将Json字符串反序列化成List对象类集合

    摘自:http://blog.csdn.net/cdefg198/article/details/7520398 using System.IO; using System.Web.Script.Se ...

  6. 将JSON字符串反序列化为指定的.NET对象类型

    目录导航: 前言: 方法一.在项目中定义对应的对象参数模型,用于映射反序列化出来的参数(复杂JSON字符串数据推荐使用): 方法二.直接将JSON字符串格式数据反序列化转化为字典数据(简单JSON字符 ...

  7. js将json字符串转化成json对象的方法

    js将json字符串转化成json对象的方法: JSON.parse(jsonObject)

  8. json字符串转java对象,json中字段名称与对象属性名称不一致

    json字符串转java对象,json字段名称与对象属性名称不一致可以在对象属性上添加注解@SerializedName解决

  9. ajax提交后台自动反序列化成对象

    下面是ajax提交的方法,主要用到了$form.serializeArray()将表单序列化成json对象,然后用each处理一下,代码如下: var $form = $('<form>& ...

随机推荐

  1. 微信小程序开发---逻辑层(App Service)

    再说逻辑层之前,先说说微信小程序框架(MINA) 小程序开发框架的目标是通过尽可能简单.高效的方式让开发者可以在微信中开发具有原生APP体验的服务. 框架提供了自己的视图层描述语言WXML和WXSS, ...

  2. 自己封装element-ui树组件的过滤

    前言:vue开发项目时用到了element-ui的树组件,但是发现一执行过滤事件,树就全部都展开了,为了解决这个问题,只能自己先过滤数剧,再赋值给树组件的data,就避免了一上来全部展开的尴尬. 一. ...

  3. 将DataRow拷贝到另一个DataRow

    DataRow dr = dtPadFluid.Rows[gvPadFluid.FocusedRowHandle]; foreach (DataColumn dc in _dr.Table.Colum ...

  4. Burp Suite Pro 教程

    1.Burp Suite Pro2.0.11破解版-2018.11.06更新 说明基地址 来源:http://ximcx.cn/post-110.html 启动;如果是用的burp2.0,把下面的代码 ...

  5. 手机touch事件及参数【转】(自己懒得写了,找了一篇摘过来)

    [html5构建触屏网站]之touch事件 前言 一个触屏网站到底和传统的pc端网站有什么区别呢,交互方式的改变首当其冲.例如我们常用的click事件,在触屏设备下是如此无力. 手机上的大部分交互都是 ...

  6. MP3、MP4的文件选择及播放

    项目主页网址如下: https://github.com/Judylalala/en ####技术问题1:如何播放音频(MP3).视频(MP4)? ####解决过程1:我首先想到了XMAL插件中的Me ...

  7. linux系统中的时间

    1.编程显示系统时间: #include <stdio.h> #include <time.h> /* gcc -o fix fixedFormatTime.c ./fix * ...

  8. Dubbo支持的协议的详解

    Dubbo支持dubbo.rmi.hessian.http.webservice.thrift.redis等多种协议,但是Dubbo官网是推荐我们使用Dubbo协议的.下面我们就针对Dubbo的每种协 ...

  9. Python爬虫5-利用usergent伪装访问方式

    GitHub代码练习地址:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac08_useragent.py UserAgen ...

  10. [Swift]LeetCode227. 基本计算器 II | Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...