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

一,前言

  最近做项目采用Json形式和其他客户端交互,借助于Newtonsoft.Json 。

  由于业务场景不同,输出的Json内容也不同。要想忽略的属性,可以借助Newtonsoft.Json的特性,在实体前面添加特性[JsonIgnore]即可,但有时候会根据业务需求,在不同的地方输出同一个实体中不同的属性,所以添加特性的方式显然不能满足要求。例如user表,在A场景下需要password;B场景下不需要。

二,解决办法

  可以重写Newtonsoft.Json的DefaultContractResolver类。

  步骤一:继承DefaultContractResolver

  新建类继承Newtonsoft.Json的类 DefaultContractResolver,重写CreateProperties方法,代码如下:

    /// <summary>
    /// Json分解器
    /// </summary>
    public class JsonPropertyContractResolver : DefaultContractResolver
    {
        IEnumerable<string> lstExclude;
        public JsonPropertyContractResolver(IEnumerable<string> excludedProperties)
        {
            lstExclude = excludedProperties;
        }

        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            return base.CreateProperties(type, memberSerialization).ToList().FindAll(p => lstExclude.Contains(p.PropertyName));//需要输出的属性
        }
    }

  步骤二:使用方法

  假设我们需要转化为Json的实体列表是Product,场景一,这个列表中的Price属性不需要转成Json到前端;场景二,这个列表中的ShopID和Count属性不需要转成Json到前端。代码如下:

List<Product> ProductList = new List<Product>
                                                {
                                                    new Product
                                                    {
                                                        ShopID = 1,
                                                        Price=10,
                                                        Count=4,
                                                        Name = "商品一"
                                                    },
                                                    new Product
                                                    {
                                                        ShopID = 2,
                                                         Price=11,
                                                        Count=3,
                                                        Name = "商品二"
                                                    },
                                                    new Product
                                                    {
                                                        ShopID = 1,
                                                         Price=12,
                                                        Count=1,
                                                        Name = "商品三"
                                                    },
                                                    new Product
                                                    {
                                                        ShopID = 2,
                                                         Price=17,
                                                        Count=10,
                                                        Name = "商品四"
                                                    },
                                                    new Product
                                                    {
                                                        ShopID = 3,
                                                        Price=13,
                                                        Count=2,
                                                        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));

  输出结果:

时间: 2024-10-21 23:44:47

Newtonsoft.Json输出Json时动态忽略属性的相关文章

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

由于$id.$ref等是默认Json.NET的特殊属性,在反序列化时不会将其对应的值填充,例如: [DataContract] public class MyObject { [DataMember(Name = "$id")] public string Id { get; set; } } 这个时候可以通过自定义JsonSerializerSettings将MetadataPropertyHandling设置为Ignore,例如: public static T Deseriali

java实体转json忽略属性

1: import com.alibaba.fastjson.annotation.JSONField; fastjson 过滤指定字段 @JSONField(serialize=false)private String message; 序列化的时候就不会包含这个字段. 另外, 你从一个bean中只取一个字段,没必要这样做,你完全可以定义一个新的bean. 2: @JsonIgnoreProperties(value={"addressId"})//在解析成json时,忽略子属性的a

如何遍历json属性和动态添加属性

var person= { name: 'zhangsan', pass: '123' , 'sni.ni' : 'sss', hello:function (){ for(var i=0;i<arguments.length;i++){ //在不知参数个数情况下可通过for循环遍历 // arguments这个是js 默认提供 alert("arr["+i+"]="+arguments[i]); } } } //遍历属性 for(var item in pe

当使用servlet输出json时,浏览器端jquery的ajax遇到parse error的问题

在使用jquery的ajax进行请求发送并由服务端的servlet返回json格式的数据内容时,假设输出内容没有正确设置,会遇到client浏览器报告parse error的问题.这个问题的解决仅仅须要注意下面两点: 第一.在servlet输出json格式的内容是请在response.getWriter()之前运行response.setContentType("application/json"); 第二,输出的json格式字符串一定是使用双引號包括的( 比方:{"user

Json动态添加属性

一维Json: var Json={}: Json.name="小明"; Json.age="12": Json.sex="男": 输出效果: 例如获取name:Json.name 二维Json: var feed=[];//添加属性feed feed[0]={}; feed[0].sex="男"; feed[0].name="小明"; feed[1]={}; feed[1].sex="女&quo

Laravel输出JSON时设定输出字段的几种情况总结

1.如果输出json的时候需要屏蔽某些字段,或则想自定义显示的字段: 1.model里面设置 protected $hidden = ['password'];//要屏蔽的字段 2.model里面设置 protected $visiable = ['name'];//要显示的字段 3.查询的时候用distinct,指定要显示的字段 XX::distinct([你要显示的字段]); 4.查询的时候在get或first指定要显示的字段 XX::get([你要显示的字段]); 2.如果用到了relat

.Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程

JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询.目前已被微软集成于webapi框架之中,因此,熟练掌握JSON.NET相当重要,这篇文章是零度参考官网整理的示例,通过这些示例,可以全面了解JSON.NET提供的功能. Newtonsoft.Json的地址: 官网:http://json.codeplex.com/ 源码地址:https://gi

django rest_framework中将json输出字符强制为utf-8编码

最近在和日本外包合作开发JIRA对接发布系统的版本单时, 遇到这个问题. 就是我们这边的输出浏览器显示为中文,而到了JIRA端就出现乱码. 查了文档,原来django rest_framework的默认json是没指定编码的, 需要随接收方的环境编码来显示. 于是,因为项目进度,我们对了强制编码操作. 查看rest framework的源代码: class JSONRenderer(BaseRenderer): """ Renderer which serializes to

格式化输出Json对象

1.调用方式: alert(JsonUti.convertToString(jsonObj)); //jsonObj为json对象. 2.格式化输出Json对象方法定义: var JsonUti = { //定义换行符 n: "\n", //定义制表符 t: "\t", //转换String convertToString: function(obj) { return JsonUti.__writeObj(obj, 1); }, //写对象 __writeObj: