一,前言

  最近做项目采用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时动态忽略属性的更多相关文章

  1. Newtonsoft.Json输出JSON 时动态忽略属性

    一,前言 最近做项目采用Json形式和其他客户端交互,借助于Newtonsoft.Json . 由于业务场景不同,输出的Json内容也不同.要想忽略的属性,可以借助Newtonsoft.Json的特性 ...

  2. EF 实体+ Newtonsoft.Json 输出JSON 时动态忽略属性的解决方法

    最近的项目采用的是 ASP.NET mvc 4.0 + entity framework 5.0 ,后台以JSON形式抛出数据是借助于Newtonsoft.Json ,   要想忽略的属性前面添加特性 ...

  3. Java开发中POJO和JSON互转时如何忽略隐藏字段

    1. 前言 在Java开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道.通常情况下我们会将其设置为null或者空字符 "",其实还有其它办法,如果你使用了Ja ...

  4. Json.NET Deserialize时如何忽略$id等特殊属性

    由于$id.$ref等是默认Json.NET的特殊属性,在反序列化时不会将其对应的值填充,例如: [DataContract] public class MyObject { [DataMember( ...

  5. 使用Newtonsoft.Json输出JSON

    安装: Install-Package Newtonsoft.Json 代码: //序列化DataTable DataTable dt = new DataTable(); dt.Columns.Ad ...

  6. Json序列化指定输出字段 忽略属性

    DataContract 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务 ...

  7. 简单实体Json序列化(输出JSON的属性可变)

    简单实体Json序列化(输出JSON的属性可变) 一.先看效果 可以看出 , 我们在序列化一个对像时, 只给出了 我们想要 输出的两个字段名,  实际实体有5个属性, 经过可变属性序列化后的JSON ...

  8. DotNetCore跨平台~Json动态序列化属性

    回到目录 Json动态序列化属性,主要为了解决一个大实体,在返回前端时根据需要去序列化,如果实体里的某个属性在任务情况下都不序列化,可以添加[JsonIgnore]特性,这种是全局的过滤,但是更多的情 ...

  9. java实体转json忽略属性

    1: import com.alibaba.fastjson.annotation.JSONField; fastjson 过滤指定字段 @JSONField(serialize=false)priv ...

随机推荐

  1. NCE损失(Noise-Constrastive Estimation Loss)

    1.算法概述 假设X是从真实的数据(或语料库)中抽取的样本,其服从一个相对可参考的概率密度函数P(d),噪音样本Y服从概率密度函数为P(n),噪音对比估计(NCE)就是通过学习一个分类器把这两类样本区 ...

  2. 关于python环境配置的博客收藏

    使用anaconda的pip来扩展anaconda的库: https://www.cnblogs.com/duan-qs/p/6289339.html 一个.py文件如何调用另一个.py文件中的类和函 ...

  3. nginx资料汇总

    nginx docker 中的一些目录和 windows下是不同的, 静态内容目录: /usr/share/nginx/html 配置文件目录: /etc/nginx 日志输出目录: /var/log ...

  4. Ubuntu16.04安装NVIDA驱动和CUDA

    该GPU是计算卡,不会用做显示,所以如果你希望自己的显示使用GPU,本方法可能失效. 服务器配置: CPU: E5-母鸡 GPU: NVIDIA  Tesla K40c 操作系统:Ubuntu 16. ...

  5. Java 集合系列03之 ArrayList详细介绍

    ArrayList做为List接口中最常用的实现类,必须掌握. 一.ArrayList简介 与Java中的数组相比ArrayList的容量可以动态增加.它继承与AbstractList,实现了List ...

  6. Linux 日志文件管理——限制大小

    设计思路: 1 用一个INI配置文件管理日志目录,日志文件限制的大小,特殊的日志名,特殊日志的大小限制. 2 读取INI文件中的所有信息:每一个日志目录对应的大小限制,每一个特殊日志对应的大小限制.如 ...

  7. junit测试

    /**ssm框架测试service**/ import com.alibaba.fastjson.JSON; import com.raycloud.waimai.customer.center.po ...

  8. T-SQL实用查询之查询字段所属的数据库表

    SELECT b.name as TableName,a.name as columnname From syscolumns a INNER JOIN sysobjects b ON a.id=b. ...

  9. JAVA进阶18

    间歇性混吃等死,持续性踌躇满志系列-------------第18天 1.飞机游戏小项目 ①创建窗口 package cn.xfj.game; import javax.swing.*; import ...

  10. springboot自定义配置信息读取

    在properties配置文件加入自定义配置例如: zxgl.detail.url=http://*****/zxgl-web/news/viewNewsIndexDetail.do?id= #资讯t ...