Newtonsoft JSON合并/序列化时如何移除动态对象的空属性?
解决动态对象序列化时自动移除空值属性的问题
嘿,这个场景我太熟了!完全不需要手动递归遍历移除空值属性,Newtonsoft JSON(Json.NET)提供了现成的序列化配置,能直接帮你搞定未知模型的动态对象空值过滤需求。
具体实现步骤
只需要在序列化时配置JsonSerializerSettings的NullValueHandling属性为NullValueHandling.Ignore,就能自动丢弃所有值为null的属性:
// 假设你的动态对象jf是ExpandoObject类型(动态对象常见实现) dynamic jf = new ExpandoObject(); jf.hello = "world"; jf.test = null; // 配置序列化规则 var serializerSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; // 执行序列化 string outputJson = JsonConvert.SerializeObject(jf, serializerSettings); // 最终输出结果:{"hello":"world"}
针对疑问的详细解答
- 要不要手动递归处理? 完全不用!上面的配置会自动递归处理对象的所有层级(就算动态对象有嵌套结构也能生效),帮你过滤所有
null值属性,省掉了自己写递归逻辑的麻烦。 - JsonProperty的NullValueHandling为什么不适用? 这个特性是给静态模型类的属性加的标记,比如你提前定义了一个实体类,给某个属性加
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]。但你现在处理的是未知模型的动态对象,没法给动态生成的属性加特性,所以全局的JsonSerializerSettings才是适配这种场景的最优解。
额外小提示
如果之后遇到需要针对特定空值做保留/忽略的差异化需求,还可以结合DefaultValueHandling等其他配置调整,但针对你当前的需求,上面的代码就足够完美解决问题啦。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

