一,前言

  最近做项目采用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. VMware 安装Linux系统 CentOS

    VMware 安装Linux系统 CentOS 1.  下载镜像系统 centos镜像下载地址:https://www.centos.org/download/ 选择DVD下载即可 linux各版本下 ...

  2. H5_0005:JS判断域名和时间有效期的方法

    (function () { var n = { c: function (t, e) { //console.log("c"); //把i(15)的d数组转换成字串 for (v ...

  3. Swagger UI及 Swagger editor教程 API文档搭配 Node使用

    swagger ui 是一个在线文档生成和测试的利器,目前发现最好用的.为啥好用呢?打开 demo,支持API自动生成同步的在线文档些文档可用于项目内部API审核方便测试人员了解 API这些文档可作为 ...

  4. 使用scrapy选择器selector解析获取百度结果

    0x00 概述 需要成功安装scrapy,安装方法与本文无关,不在这多说. 0x01 配置settings 由于百度对于user-agent进行验证,所以需要添加. settings.py中找到DEF ...

  5. java实现单链接的几种常用操作

    public class ListNode { public int value; public ListNode next; public ListNode(int value) { this.va ...

  6. SQL SERVER获取信息的方法

    获取数据库的表 SELECT obj.name tablename, schem.name schemname, CAST ( CASE ) ) END AS BIT) HasPrimaryKey f ...

  7. Python爬虫从入门到进阶(2)之urllib库的使用

    1.什么是Urllib(官网地址:https://docs.python.org/3/library/urllib.html#module-urllib) Urllib是python内置的HTTP请求 ...

  8. 使用git把本地目录传到远程仓库

    需求: 要把本地不为空的一个目录和远程现有的一个仓库关联 步骤如下: git init //生成.git目录 git add . //把当前目录里的文件加入到暂存区 git commit -m '上传 ...

  9. c# 利用IEqualityComparer接口去除DataTable重复数据

    IEqualityComparer主要适用于定义方法以支持对象的相等比较.可以实现集合的自定义相等比较.即,您可以创建自己的相等定义,并指定此定义与接受 IEqualityComparer 接口的集合 ...

  10. 【Flask】Flask学习笔记(一) 应用基本结构

    初始化 使用前必须创建一个应用实例 from flask import Flask app = Flask(__name__) 路由和视图函数 请求流程 客户端(web浏览器)-->  web服 ...