简介:本人在开发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. vue简单指令笔记

    v-once 执行一次性插值,数据改变插值处内容不会更新 <span v-once>这个将不会改变: {{ msg }}</span> v-text 插入文本 <!--两 ...

  2. PHP实现微信模板消息发送给指定用户

    使用公众号的模板消息功能,必须是认证过的服务号,需要发送微信号的openid,同一微信号在不同公众号下的openid是不同的,在公众号下是唯一的,获取不到微信号 进入公众平台  功能->模板消息 ...

  3. apicloud实现各种自定义弹层组件

  4. Hadoop集群搭建过程中ssh免密码登录(二)

    一.为什么设置ssh免密码登录 在集群中,Hadoop控制脚本依赖SSH来执行针对整个集群的操作.例如,某个脚本能够终止并重启集群中的所有守护进程.所以,需要安装SSH,但是,SSH远程登陆的时候,需 ...

  5. hello1和hello2代码分析

    1.hello1代码分析 hello.java package javaeetutorial.hello1; import javax.enterprise.context.RequestScoped ...

  6. framework7 入门(数据获取和传递)

    数据获取 framework7自带request方法 , var app = new Framework7({...});app.request(parameters) 或者 Framework7.r ...

  7. 报错Domain=NSCocoaErrorDomain Code=3840 "Garbage at end."

    网络请求出现报错:Domain=NSCocoaErrorDomain Code=3840 "Garbage at end." 出现的问题是后台返回了两次json数据!

  8. 编写程序,输入一个N,返回角谷变换(达到1所需)的次数

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 17:36 * @description ...

  9. Vue(day2)

    一.过滤器 Vue中可以自定义过滤文本插值的过滤器.目前有两个地方可以使用: 插值文本{{ var }}中使用. 在v-bind中使用.( 2.1.0+ ) 用法:使用管道连接符 | 将需要过滤的文本 ...

  10. [Swift]LeetCode169. 求众数 | Majority Element

    Given an array of size n, find the majority element. The majority element is the element that appear ...