Newtonsoft.Json输出JSON 时动态忽略属性
一,前言
最近做项目采用Json形式和其他客户端交互,借助于Newtonsoft.Json 。
由于业务场景不同,输出的Json内容也不同。要想忽略的属性,可以借助Newtonsoft.Json的特性,在实体前面添加特性[JsonIgnore]即可,但有时候会根据业务需求,在不同的地方输出同一个实体中不同的属性,所以添加特性的方式显然不能满足要求。例如user表,在A场景下需要password;B场景下不需要。
二,解决办法
可以重写Newtonsoft.Json的DefaultContractResolver类。
步骤一:继承DefaultContractResolver
新建类继承Newtonsoft.Json的类 DefaultContractResolver,重写CreateProperties方法,代码如下:
public class JsonPropertyContractResolver : DefaultContractResolver
{
IEnumerable<string> lstInclude;
public JsonPropertyContractResolver(IEnumerable<string> includeProperties)
{ lstInclude = includeProperties;
} protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{ return base.CreateProperties(type, memberSerialization).ToList().FindAll(p => lstInclude.Contains(p.PropertyName));//需要输出的属性 } }
}
}
步骤二:使用方法
假设我们需要转化为Json的实体列表是Product,场景一,这个列表中的Price属性不需要转成Json到前端;场景二,这个列表中的ShopID和Count属性不需要转成Json到前端。代码如下:
List<Product> ProductList = new List<Product>
{
new Product
{
ShopID = ,
Price=,
Count=,
Name = "商品一"
},
new Product
{
ShopID = ,
Price=,
Count=,
Name = "商品二"
},
new Product
{
ShopID = ,
Price=,
Count=,
Name = "商品三"
},
new Product
{
ShopID = ,
Price=,
Count=,
Name = "商品四"
},
new Product
{
ShopID = ,
Price=,
Count=,
Name = "商品五"
}
}; //场景一
string jsonString = JsonConvert.SerializeObject(ProductList, Formatting.Indented, new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
ContractResolver = new JsonPropertyContractResolver(new List<string> { "ShopID", "Name", "Count" })
});
Console.WriteLine("场景一:" + jsonString); //场景二
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
settings.ContractResolver = new JsonPropertyContractResolver(new List<string> { "Name", "Price" });
Console.WriteLine("场景二:" + JsonConvert.SerializeObject(ProductList, settings));
输出结果:

Newtonsoft.Json输出JSON 时动态忽略属性的更多相关文章
- Newtonsoft.Json输出Json时动态忽略属性
一,前言 最近做项目采用Json形式和其他客户端交互,借助于Newtonsoft.Json . 由于业务场景不同,输出的Json内容也不同.要想忽略的属性,可以借助Newtonsoft.Json的特性 ...
- EF 实体+ Newtonsoft.Json 输出JSON 时动态忽略属性的解决方法
最近的项目采用的是 ASP.NET mvc 4.0 + entity framework 5.0 ,后台以JSON形式抛出数据是借助于Newtonsoft.Json , 要想忽略的属性前面添加特性 ...
- Java开发中POJO和JSON互转时如何忽略隐藏字段
1. 前言 在Java开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道.通常情况下我们会将其设置为null或者空字符 "",其实还有其它办法,如果你使用了Ja ...
- Json.NET Deserialize时如何忽略$id等特殊属性
由于$id.$ref等是默认Json.NET的特殊属性,在反序列化时不会将其对应的值填充,例如: [DataContract] public class MyObject { [DataMember( ...
- 使用Newtonsoft.Json输出JSON
安装: Install-Package Newtonsoft.Json 代码: //序列化DataTable DataTable dt = new DataTable(); dt.Columns.Ad ...
- Json序列化指定输出字段 忽略属性
DataContract 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务 ...
- 简单实体Json序列化(输出JSON的属性可变)
简单实体Json序列化(输出JSON的属性可变) 一.先看效果 可以看出 , 我们在序列化一个对像时, 只给出了 我们想要 输出的两个字段名, 实际实体有5个属性, 经过可变属性序列化后的JSON ...
- DotNetCore跨平台~Json动态序列化属性
回到目录 Json动态序列化属性,主要为了解决一个大实体,在返回前端时根据需要去序列化,如果实体里的某个属性在任务情况下都不序列化,可以添加[JsonIgnore]特性,这种是全局的过滤,但是更多的情 ...
- java实体转json忽略属性
1: import com.alibaba.fastjson.annotation.JSONField; fastjson 过滤指定字段 @JSONField(serialize=false)priv ...
随机推荐
- Nginx教程(一) Nginx入门教程
Nginx教程(一) Nginx入门教程 1 Nginx入门教程 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行.由 ...
- rowid去重(删除表的重复记录)
-- 构造测试环境SQL> create table andy(id int,name varchar2(10));Table created.SQL>insert into andy v ...
- zepto源码分析系列
如果你也开发移动端web,如果你也用zepto,应该值得你看看.有问题请留言. Zepto源码分析-架构 Zepto源码分析-zepto(DOM)模块 Zepto源码分析-callbacks模块 Ze ...
- Java web中常见编码乱码问题(一)
最近在看Java web中中文编码问题,特此记录下. 本文将会介绍常见编码方式和Java web中遇到中文乱码问题的常见解决方法: 一.常见编码方式: 1.ASCII 码 众所周知,这是最简单的编码. ...
- QT调用百度语音REST API实现语音合成
QT调用百度语音REST API实现语音合成 1.首先点击点击链接http://yuyin.baidu.com/docs/tts 点击access_token,获取access_token,里面有详细 ...
- Coursera 机器学习笔记(五)
主要第七周的内容:支持向量机 可以参考JerryLeed 的支持向量机SVM系列博客http://www.cnblogs.com/jerrylead 以及 pluskid的支持向量机系列博客http: ...
- less函数
问题描述: 在编写页面时,有以下几种按钮: 这时候我们CSS代码毫无疑问写一个公共类,然后再为每个按钮增加独自的样式如下: HTML: <div class="common a&quo ...
- C++构造函数(一)
本篇是介绍C++的构造函数的第一篇(共二篇),属于读书笔记,对C++进行一个系统的复习. 构造函数的概念和作用 全局变量未初始化时为0,局部变量未初始化时的值却是无法预测的.这是因为,全局变量的初始化 ...
- 常用SHELL命令
1.查看版本号cat /proc/version; uname -a; uname -r 2.查看用户组cat /etc/group 3.查看当前用户组 groups 4.查看当前用户 whoami ...
- PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结
前 言 OOP 学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1 PHP中的抽象 ...